【问题标题】:Android maintain activity state with dataAndroid 用数据维护活动状态
【发布时间】:2015-02-16 11:26:44
【问题描述】:

我有 2 项不同的活动。 MainActivityContactListContactDetails。现在从 MainActivity 用户将点击 Add new 并且应用程序将打开 ContactList 屏幕,用户可以从中选择任何联系人以查看打开 ContactDetails 活动的详细信息。现在,如果用户选择任何否。从 ContactDetails 中,应用程序将返回 MainActivity 并添加所选编号。在数组列表中。我可以添加数据,但我的问题是,每当添加新记录时,旧记录都会被删除。我发现每次我从 ContactDetails 打开 MainActivity 它会创建新的 Activity 的原因。所以我正在寻找一种方法来使用 OnResumeOnResult 方法来解决问题。

在联系方式中

Intent 意图 = new Intent(getBaseContext(), MainActivity.class); intent.putExtra("CONTACT_NO", CONTACT_NO);开始活动(意图)

在 MainActivity 的 OnResume 方法中

字符串数据 = getIntent().getExtras().getString("keyName");

arr.add(数据);

【问题讨论】:

  • 你创建了数据库吗?
  • 不,我没有使用数据库。
  • 发布您的代码,如何将数据发送到 MainActivity 和您的适配器
  • 我认为,onResume() 足以解决这个问题。
  • @Dipen:正如我在回答中提到的,您的“arr”将是全局和静态的。您不应该在 MainActivity.java 中初始化“arr”。您需要将其初始化为某个常量类或应用程序类。

标签: android android-activity android-fragments


【解决方案1】:

如果您希望在 Activity 的生命周期内持久保存数据,SharefPreferences 会很好地为您服务。一个例子:

写入(onPause/onDestroy):

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();

读取(onResume/onCreate):

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);

阅读更多here

更新

或者,您可以使用onSavedInstanceState。示例:

保存状态:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

恢复状态:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

有关管理 Activity 状态的更多信息here

【讨论】:

  • 感谢您的回答,但我不会不使用共享偏好。为此,我非常想将 Bundle 数据与 Activity 堆栈和生命周期一起使用。
【解决方案2】:

从您在 MainActivity.java 中获取列表的任何位置,将其作为公共静态 ArrayList 或 String 数组,不要在 MainActivity.java 中对其进行初始化。

另外,如果您没有为 MainActivity 调用 finish()(在转到 ContactListActivity.java 时),则将新数据添加到 onResume() 中的数组列表中。但请记住保持检查 - 您是否有新数据要添加,因为第一次没有数据要添加(根据您发布的问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多