【问题标题】:Activity's savedInstanceState() not being called when going to new Activity via ActionBar通过 ActionBar 进入新 Activity 时未调用 Activity 的 savedInstanceState()
【发布时间】:2015-04-15 18:35:51
【问题描述】:

任何帮助将不胜感激,因为我快完成了,这件小事让我非常烦恼!

我有三个活动之一,在 onCreate() 它从数据库查询填充 TextView。本次活动也是主要活动。您通过操作栏进行的其他 2 个活动,如下面的代码所示。我在这里有savedInstanceState()onRestoreInstanceState() 都在玩,它们只有在你完全退出应用程序时才起作用,这很好,但我也想要它,这样当你从actionBar 转到另一个Activity 时,然后TextView不必重新查询数据库。我希望textview 与您离开时相同,因为每次您使用操作栏离开时,textView 都会触发一个全新的查询,而我不希望这样。我希望它在用户第一次到达时仍然具有第一次查询的结果。

我尝试使用finish()onStop() 方法来帮助终止活动,以便在活动被销毁但它不工作或我没有将它放在正确的位置时调用saveOnInstanceState()地方。有什么想法吗?!?!?!

在 onCreate() 中应用 savedInstanceState:

if(savedInstanceState != null){
        String SavedStory = savedInstanceState.getString(SavedStoryHere);
        String SavedTitle = savedInstanceState.getString(SavedTitleHere);
        OpenningTextView.setText(SavedStory);
        TitleTextView.setText(SavedTitle);
    }
    else{
        OpenningTextView.setText(StoryText);
        TitleTextView.setText(TitleString);
    }

onSavedInstanceState() 和 onRestoreInstanceState():

protected void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    String text = OpenningTextView.getText().toString();
    String titleText = TitleTextView.getText().toString();
    savedInstanceState.putString(SavedStoryHere, text);
    savedInstanceState.putString(SavedTitleHere, titleText);
}

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    OpenningTextView.setText(savedInstanceState.getString(SavedStoryHere));
    TitleTextView.setText(savedInstanceState.getString(SavedTitleHere));        
}

通过 ActionBar 进入不同的活动:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.Openning_Screen:
            Toast.makeText(this, "This is the Story of the Day", Toast.LENGTH_SHORT)
             .show();
            return true;
        case R.id.The_List:
            Intent A_ListIntent = new Intent(this, A_Where_List.class);
            startActivity(A_ListIntent);
            return true;
        case R.id.Settings:
            Intent SavedStoriesIntent = new Intent(this, Settings.class);
            startActivity(SavedStoriesIntent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

【问题讨论】:

    标签: android android-activity android-actionbar textview android-savedstate


    【解决方案1】:

    我认为您的问题是为您的活动定义的Launch Mode。默认情况下,它允许多个实例,在这种情况下,我认为您需要一个实例。因此,当您“返回”到原始活动时,它是一个新实例,不会调用 onRestoreInstanceState()。

    尝试为清单中的活动将 launchMode 设置为 singleInstance。

    android:launchMode="singleInstance"
    

    【讨论】:

    • @KellysOnTop23 如果它为您解决了问题,您能否接受我的回答。谢谢!
    【解决方案2】:

    您看到的是预期行为。

    调用 startActivity(intent) 不会完成/破坏您当前的活动 - 这就是为什么您没有收到 onSaveInstanceState 的调用。当用户按下返回按钮时,您的 Activity 将处于离开页面时的状态。

    您应该看到的是 onPause/onResume 要求离开并重新进入您的主要活动。

    【讨论】:

    • 感谢您的回复!因此,当我调用onPause()onResume(或两者!)时,保存值的最佳方法是什么,这样我就可以让onCreate 对那个容器做它对onSavedInstanceState() 所做的事情?共享偏好?只是一个常规列表或字符串数​​组?
    • onPauseonResume 会自动为您调用。查看您的代码,您无需执行任何操作即可让您的文本字段在 Activity 重新填充时重新填充。你也可以删除 onRestoreInstanceState 方法 - 你已经在处理 onCreate 中的所有内容!
    • 请注意,我假设您的意思是当您离开 Activity,然后通过 按后退按钮 重新进入它时:“当您从actionBar 那么 TextView 还是一样的”
    • 我很笨......我的意思是当你通过 ActionBar 去另一个活动时 textView 不一样......我很抱歉。我现在就修改
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多