使用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 }
这对于片段非常@Override
– onOptionsItemSelected
@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); }
这对我的目的有用,但我觉得可能(或者应该)有更好的方法。