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

res/menu/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 が表示されている場合にアクション バーの prefs アイコンをクリックすると、PrefsFragment が表示されているときにアクション バーの prefs アイコンをクリックしても何も起こらず、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 に答える