使用onOptionsItemSelected从PreferenceArag和PreferenceFragments上升

我在使用Android Studio的默认“设置活动”( extends AppCompatPreferenceActivity )时使用onOptionsItemSelected时遇到了问题。 活动的重要部分是:

 public class SettingsActivity extends AppCompatPreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupActionBar(); } private void setupActionBar() { ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { // Show the Up button in the action bar. actionBar.setDisplayHomeAsUpEnabled(true); } } public static class GeneralPreferenceFragment extends PreferenceFragment { // [...] @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } // two more fragments } 

这对于片段非常@OverrideonOptionsItemSelected @Override可以很好地工作,返回到SettingsActivity但是当使用向上按钮时我希望SettingsActivity将控制权返回给它的父活动。

我已经阅读了文档 ,我明白了

虽然您的片段会为其添加的每个菜单项收到项目选择的回调,但当用户选择菜单项时,活动首先接收相应的回调。

这意味着我不能简单地将类似的@Override (具有不同的Intent )添加到SettingsActivity本身来处理我想要的情况,以免片段返回到父活动。

我试图通过AndroidManifest.xml处理这个问题:

    

但这似乎根本没有做任何事情。

如果有的话,处理这个问题的好方法是什么?

在Android Studio onOptionsItemSelected方法创建的模板中属于片段。

我通过评论它们并为重写onBackPressed的活动编写onOptionsItemSelected方法解决了这个问题

 @Override public void onBackPressed() { super.onBackPressed(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { onBackPressed(); return true; } return super.onOptionsItemSelected(item); } 

经过几个不费力的搜索网络时间后,我想出了一个原始的(但略带hackish)解决方案。

我在SettingsActivity添加了一个字段: private boolean inFragment;

在片段’ onCreate()方法中,我添加了

 ((SettingsActivity) getActivity()).inFragment = true; 

最后,我在SettingsActivity使用了@Override

 @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { if (!inFragment) { Intent upIntent = NavUtils.getParentActivityIntent(this); NavUtils.navigateUpTo(this, upIntent); return true; } return false; } return super.onOptionsItemSelected(item); } 

这对我的目的有用,但我觉得可能(或者应该)有更好的方法。