如何防止在android中使用PreferencesFragment时出现双addtobackstack

如何防止在android中使用PreferencesFragment时出现双addtobackstack,android,Android,背景: 我正在使用PreferencesFragment管理android应用程序中的首选项,并使用选项菜单访问这些首选项 MainActivity类重写的方法: res/menu/menu.xml: 问题: 在主屏幕上,我单击操作栏中的首选项图标,PrefsFragment启动 在PrefsFragment上,我单击操作栏中的首选项图标PrefsFragment再次启动(这就是问题所在) 我点击后退按钮,它恢复片段事务并返回到PrefsFragment。(应返回主屏幕) 问题: 有没有

背景:

我正在使用PreferencesFragment管理android应用程序中的首选项,并使用选项菜单访问这些首选项

MainActivity类重写的方法:

res/menu/menu.xml:


问题:

  • 在主屏幕上,我单击操作栏中的首选项图标,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;
}