0

それぞれが独自のChild Fragment Managersを使用してドリルダウンナビゲーションを提供する3つの 'トップレベル'フラグメントのセットを持っています。これらの最上位フラグメントは、主アクティビティーのサポート・フラグメント・マネージャーを使用して置換されることによって、切り替えられます。フラグメントが置換されたときにフラグメントによってツールバーのメニューオプションが追加される

この最上位フラグメントの1つに、setHasOptionsMenu()onCreateOptionsMenu()を使用してメニューオプションをツールバー/アクションバーに追加する子フラグメントがあり、うまく動作します。

は、今私はちょうど気づいた問題はこれです:

新しい子フラグメントが追加され、メニュー項目を持つ子フラグメントが隠されている(とトランザクションがトップレベルのフラグメントのbackstackに追加)する場合、メニュー項目が消えます。同様に、トランザクションを元に戻すことでフラグメントが再び表示されると、メニュー項目が戻ってきます。これは望ましい動作であり、フラグメントフレームワークによって完全に処理されているようです。

HOWEVER、子フラグメントが表示され、そのメニューアイテムがツールバーに表示され、トップレベルのフラグメントを切り替えると、メニュー項目はツールバーに残ります。

これは、それが属する子フラグメントだけがダンプされているだけでなく、親フラグメント(トップレベルフラグメントのもの)も完全に置き換えられたバックスタッキングには、まっすぐ上に置き換えられます)。

私は、着信している最上位フラグメントが再開したときに常にアクティビティにinvalidateOptionsMenu()を呼び出すことができますが、トップレベルのフラグメント内をナビゲートするときに自動的に処理されるように、 。

答えて

0

子フラグメントを破棄する前に呼び出される親フラグメントでコールバックを実装しようとしてください。

public class QuickSetup1Fragment extends Fragment { 
    private CallbackListener onCallbackListener; 
    public QuickSetup1Fragment() {} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_quick_setup1, container, false); 
     return view; 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
    } 

    public interface CallbackListener{ 
     public void onAttach(); //fragment is visible 
     public void onDetach(); //fragment is invisible/replace/destroy 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      onCallbackListener = (CallbackListener) context; 
      onCallbackListener.onAttach(); 
     } catch (ClassCastException e) { 
      throw new ClassCastException(context.toString() 
       + " must implement CallbackListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     onCallbackListener.onDetach(); 
     onCallbackListener = null; 
    } 
} 

そして、あなたの活動にインターフェイスメソッドを実装します。そのコールバックする場所oncreateoptions()

1

最も簡単な方法は、あなたのフラグメントでインターフェースを作成することであり、および/ onDetach方法をONATTACH使用してフラグメントの可視性をチェックインサイドクラス

public class QuickSetupActivity extends AppCompatActivity implements QuickSetup1Fragment.CallbackListener{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_view); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
    } 

    @Override 
    protected void onPostCreate(@Nullable Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
    } 

    @OnClick(R.id.backBtn) 
    public void back(View v){ 
     super.onBackPressed(); 
    } 

    @Override 
    public void onAttach(){ 
     //do something with the menu 
    } 

    @Override 
    public void onDetach(){ 
     //do something with the menu 
    } 
} 

フラグメントを変更するたびに、onAttach/onDetachがトリガーされます。ここでは、メニューの管理のような特定のタスクを実行できます。

+0

おかげで、私はすでに本当に活動の独自のbackstackからのような独立したbackstacksを果たすだけの空の断片である私のトップレベルの断片と同様のセットアップを持っています。これらのフラグメントは、多くのライフサイクルイベントや戻るボタンの押下などのアクティビティとインターフェースします。私はこの方法で 'invalidateOptionsMenu()'を簡単に使うことができましたが、フラグメントがただ隠れているのにChild Fragment Managerでメニューが自動的に管理されているように見えますが、Activity Fragでは表示されません。フラグメントが完全に置き換えられたときのマネージャ。私は何かが欠けているように感じる。 – RobertoCuba

0

各フラグメントの作成または再作成時にonCreateOptionsMenuメソッドが呼び出されます。 あなたがする必要があるのは、新しいメニューXMLを膨張させる前にメニューをクリアすることです。これを行うにしてください :

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState){ 
    super.onViewCreated(view, savedInstanceState); 
    setHasOptionsMenu(true); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ 
    super.onCreateOptionsMenu(menu, inflater); 
    menu.clear(); 
    inflater.inflate(R.menu.your_menu, menu); 
} 
関連する問題