【问题标题】:Return value to a different Activity将值返回给不同的 Activity
【发布时间】:2015-07-04 07:21:17
【问题描述】:

我有一个应用程序,基本上看起来像附图中的设计。 可以看到,有 4 个 Activity,其中一些 Activity 有片段。

我想将测试的答案返回到用户的个人资料。 到目前为止,我一直在将结果上传到服务器,并让应用在用户每次返回 ProfileActivity 时更新他们的个人资料,但这似乎是一种资源浪费。

在应用程序中是否有执行此操作的模式或方法? 我查看了this:如果我能以某种方式链接两个startActivityForResult()s,这似乎是可行的。

我研究过使用this question 中描述的委托模式,但我无法将 UserFragment 的实例传递给 TestActivity

我希望有人能指出正确的做法。

【问题讨论】:

  • 您可以将用户对象存储在首选项中。当它的值发生变化时,您可以更新该对象。显示存储在个人资料活动偏好中的用户数据。

标签: android android-fragments android-intent android-activity delegates


【解决方案1】:

一种方法是使用startActivityForResult() 不要完成任何Activity

通过startActivityForResult()开始所有活动,然后根据您的情况您可以完成活动

使用onActivityResult()将结果传回上一个活动

然后对于片段,您可以将片段对象存储在 ProfileActivity 中。 更新UI的Fragment写入方法

因此您可以使用片段对象访问该方法

class ProfileActivity extends ......
{
  @override
  public void onActivityResult(....)
  {
    .....
    frgamnetObject.updateUI();
    ....
  }
}

【讨论】:

  • 我倾向于这种方法,但我有一个问题。第二个活动 (TestActivity) 可能会在测试完成后继续。使用 setResult(RESULT_OK, intent) 发回结果后,我可以保持活动打开吗?还是我必须调用finish()?
  • 您可以继续运行,但最佳做法是完成,因为我们希望将数据保存到之前的活动中,以便完成前面的活动工作。或者,如果需要,您可以让它继续运行
  • 好的,这很有效,而且似乎是最“Android”的做法。
【解决方案2】:

假设您从最后一页获得一个 int 值:

创建类:

public class GenericUtility {

public static int getIntFromSharedPrefsForKey(String key, Context context)
{
    int selectedValue = 0;

    SharedPreferences prefs = context.getSharedPreferences("com.your.packagename", Context.MODE_PRIVATE);
    selectedValue = prefs.getInt(key, 0);

    return selectedValue;
}

public static boolean setIntToSharedPrefsForKey(String key, int value, Context context)
{
    boolean savedSuccessfully = false;

    SharedPreferences prefs = context.getSharedPreferences("com.your.packagename", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();

    try
    {
        editor.putInt(key, value);
        editor.apply();
        savedSuccessfully = true;
    }
    catch (Exception e)
    {
        savedSuccessfully = false;
    }

    return savedSuccessfully;
}

public static String getStringFromSharedPrefsForKey(String key, Context context)
{
    String selectedValue = "";

    SharedPreferences prefs = context.getSharedPreferences("com.your.packagename", Context.MODE_PRIVATE);
    selectedValue = prefs.getString(key, "");

    return selectedValue;
}

public static boolean setStringToSharedPrefsForKey(String key, String value, Context context)
{
    boolean savedSuccessfully = false;

    SharedPreferences prefs = context.getSharedPreferences("com.your.packagename", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();

    try
    {
        editor.putString(key, value);
        editor.apply();
        savedSuccessfully = true;
    }
    catch (Exception e)
    {
        savedSuccessfully = false;
    }

    return savedSuccessfully;
}
}

比给它设置int值:

GenericUtility.setIntToSharedPrefsForKey("selected_theme", 1, getApplicationContext());

GenericUtility.setIntToSharedPrefsForKey("selected_theme", 1, MyActivity.this))

在你想要结果的第一个活动中:

int selectedValue = GenericUtility.getIntFromSharedPrefsForKey("selected_theme", getApplicationContext());

int selectedValue = GenericUtility.getIntFromSharedPrefsForKey("selected_theme", MyActivity.this);

selectedValue 如果没有值,将返回默认值。 PS 在类中将 int 更改为 String 以相应地获取和设置结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多