我在使用Android Studio的默认“设置活动”(onOptionsItemSelected
)时使用extends AppCompatPreferenceActivity
时遇到问题。活动的重要部分是:
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
}
这适用于片段 - onOptionsItemSelected
@Override
效果很好,返回SettingsActivity
,但我希望SettingsActivity
将控制权返回给它使用向上按钮时的父活动。
我已阅读the documentation,我理解
虽然您的片段会为其添加的每个菜单项收到一个项目选择的回调,但当用户选择菜单项时,活动首先会收到相应的回调。
这意味着我不能简单地将类似的@Override
(使用不同的Intent
)添加到SettingsActivity
本身来处理我想要的情况,以免碎片返回到父级而不是活动。
我尝试通过AndroidManifest.xml
处理此问题:
<activity
android:name=".SettingsActivity"
android:label="@string/title_activity_settings"
android:parentActivityName=".BlahBlahActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.appthing.BlahBlahActivity" />
</activity>
但这似乎没有做任何事情。
处理这个问题有什么好办法?
答案 0 :(得分:6)
在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);
}
答案 1 :(得分:1)
在网上搜索了几个小时之后,我想出了一个粗略的(但略带hackish)解决方案。
我在SettingsActivity
添加了一个字段:private boolean inFragment;
在片段'onCreate()
方法中,我添加了
((SettingsActivity) getActivity()).inFragment = true;
最后,我在@Override
中使用了SettingsActivity
:
@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);
}
这对我的目的有用,但我觉得可能(或者应该)有更好的方法。