Android操作栏'返回'导致OnDestroy,但设备'返回'退出首选项活动时按钮不会

时间:2014-07-02 12:05:03

标签: android android-intent android-activity

我有一个带有活动的应用。在活动中,我使用对话框片段来设置一些局部变量(这些变量DO具有默认值)。我还有一个带有“3点”图标的操作栏,允许用户设置一些偏好(共享偏好)。

所有这些都有效(即变量通过对话框正确设置,共享首选项通过PreferenceActivity设置)但是我遇到了生命周期问题:

当我使用对话框设置局部变量时,通过操作栏3点图标>更改共享首选项。在我完成在应用程序中编辑这些设置后,我看到了两个不同的结果:     1.如果我使用手机上的“后退”按钮(谷歌Nexus 5),我所有的局部变量都会像我希望的那样保留下来。     2.如果我使用顶部操作栏中的“后退”按钮,我的局部变量将重置为默认值。

在调试时,我看到当我从首选项屏幕中点击操作栏“后退”按钮时,正在执行原始活动的OnDestroy方法,并且正在重新执行OnCreate。所以底线,我知道为什么我的变量被重新设置(因为我的原始活动和更新的局部变量被破坏并且正在创建一个新实例),但我不知道为什么动作栏'后退'功能似乎表现与手机的后退按钮完全不同。我已经尝试更改清单中的启动模式,但这并没有改变行为。我也遍布各个互联网/ android开发者网站,似乎找不到任何东西。

我可以解决这个问题,但我真的希望能够使用操作栏后退按钮,因为我认为它更直观,并且希望它的行为类似于手机的后退按钮。任何帮助/解释都会很棒!

主要活动(为简洁起见,已删除不相关的代码):

    public class fretboard_flashcards extends FragmentActivity implements OnClickListener {
        public static final int RESULT_SETTINGS = 0;
        [declare local variables here and set to default values]

        @Override
            protected void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
                [update local variables here via FragmentManager - this works just fine]
        }

        @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.settings_fretboard_flashcards, menu);
                return true;
            }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.menu_settings:
                    Intent i = new Intent(this, settings_activity_fretboard_flashcards.class);
                    startActivityForResult(i, RESULT_SETTINGS);
                    break;
                }
                return true;
            }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
            if(requestCode==RESULT_SETTINGS)
            {
                SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
                handPosition = sharedPreferences.getString("pref_handPosition", "0");
            }
        }
    }

偏好活动:

    public class settings_activity_fretboard_flashcards extends PreferenceActivity {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            addPreferencesFromResource(R.xml.settings);
        }
    }

1 个答案:

答案 0 :(得分:2)

操作栏按钮和设备上按钮根本不同。实际的理念是操作栏按钮不是Back但Up,即子活动被销毁并返回其分层父级。设备上的Back按钮就是Back。它是应用程序中的一组导航历史记录。就像浏览器中的后退按钮一样。 Google实际上记录了此行为。我不记得确切的链接。我会在找到后立即发布链接。

找到链接 http://developer.android.com/design/patterns/navigation.html