如何防止在android中使用PreferencesFragment时出现双addtobackstack
背景: 我正在使用PreferencesFragment管理android应用程序中的首选项,并使用选项菜单访问这些首选项 MainActivity类重写的方法: res/menu/menu.xml:如何防止在android中使用PreferencesFragment时出现双addtobackstack,android,Android,背景: 我正在使用PreferencesFragment管理android应用程序中的首选项,并使用选项菜单访问这些首选项 MainActivity类重写的方法: res/menu/menu.xml: 问题: 在主屏幕上,我单击操作栏中的首选项图标,PrefsFragment启动 在PrefsFragment上,我单击操作栏中的首选项图标PrefsFragment再次启动(这就是问题所在) 我点击后退按钮,它恢复片段事务并返回到PrefsFragment。(应返回主屏幕) 问题: 有没有
问题:
- 在主屏幕上,我单击操作栏中的首选项图标,PrefsFragment启动
- 在PrefsFragment上,我单击操作栏中的首选项图标PrefsFragment再次启动(这就是问题所在)
- 我点击后退按钮,它恢复片段事务并返回到PrefsFragment。(应返回主屏幕)
如果在主屏幕上显示PrefsFragment,则单击操作栏中的prefs图标;如果在PrefsFragment可见时单击操作栏中的prefs图标,则不会执行任何操作;如果在PrefsFragment上单击back按钮,则始终返回主屏幕。是否可以尝试使用FragmentTransaction.detach完成此操作
好的,在进一步挖掘之后,我做了以下工作: 如果PrefsFragemnt可见,我将禁用操作栏/选项菜单(我可以在这里添加不同的菜单,但在这种情况下禁用它效果很好) PrefsFragment.java MainActivity.java(重写的方法): 最重要的部分是调用按钮上的
manager.executePendingTransactions()
和InvalidateOptions菜单()
,并在停止片段时调用InvalidateOptions菜单()
。这将导致每次进入prefs和退出prefs后都会刷新菜单
如果你有更好的解决方案,我会喜欢看看,因为这一个对我来说有点不妥。Grzegorz,干得好:-)。遗憾的是,android没有为这个非常常见的用例“内置”任何东西。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.menu_prefs:
PrefsFragment prefs = new PrefsFragment();
getFragmentManager()
.beginTransaction()
.replace(R.id.main_container, prefs)
.addToBackStack(null)
.commit();
break;
}
return true;
}
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_prefs"
android:icon="@android:drawable/ic_menu_preferences"
android:title="@string/menu_prefs_title"
android:showAsAction="ifRoom|withText">
</item>
</menu>
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
@Override
public void onStop() {
super.onStop();
getActivity().invalidateOptionsMenu();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
PrefsFragment prefs = (PrefsFragment)getFragmentManager().findFragmentByTag("PREFS");
if (prefs != null){
if (prefs.isVisible()) {
return true;
}
}
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.menu_prefs:
PrefsFragment prefs = new PrefsFragment();
FragmentManager manager = getFragmentManager();
manager
.beginTransaction()
.replace(R.id.main_container, prefs, "PREFS")
.addToBackStack(null)
.commit();
manager.executePendingTransactions();
invalidateOptionsMenu();
break;
}
return true;
}