0

背景:

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

MainActivity 类重写方法:

@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;
}

资源/菜单/menu.xml:

<?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>

问题:

  • 在主屏幕上,我单击操作栏中的首选项图标,PrefsFragment 启动。
  • 在 PrefsFragment 上,我单击操作栏中的首选项图标 PrefsFragment再次启动(这是出现问题的地方)。
  • 我点击后退按钮,它恢复片段事务并返回PrefsFragment。(它应该回到主屏幕)。

问题: 有什么聪明的方法可以禁用双重显示 PrefsFragment?

期望的结果: 如果在主屏幕上显示 PrefsFragment,则单击操作栏中的首选项图标,在 PrefsFragemnt 可见时单击操作栏中的首选项图标不会执行任何操作,在 PrefsFragment 上单击返回按钮始终返回主屏幕。

4

2 回答 2

1

好的,经过更多挖掘后,我做到了:

如果 PrefsFragemnt 可见,我将禁用操作栏/选项菜单(我可以在此处添加不同的菜单,但在这种情况下禁用它可以正常工作)。

PrefsFragment.java

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();
    }
}

MainActivity.java(重写方法):

@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;
}

最重要的部分是在停止片段时调用manager.executePendingTransactions()invalidateOptionsMenu()单击按钮并调用。invalidateOptionsMenu()这将导致每次我们去首选项和离开它们后刷新菜单。

如果您有更好的解决方案,我很乐意看到它们,因为这对我来说有点骇人听闻。

于 2012-07-19T16:03:03.163 回答
0

您可以尝试使用 FragmentTransaction.detach 来完成它吗?

http://developer.android.com/reference/android/app/FragmentTransaction.html#detach%28android.app.Fragment%29

于 2012-07-19T14:09:39.090 回答