Navigation Drawer + Fragments:Googleガイドの仕上げ

リンクの例をご覧ください -それはうまく機能します。 1つのma-a-scarlet行を追加します。

fragmentTransaction. addToBackStack(null); 

そして、ナビゲーションドロワー自体の位置だけでなく、戻るときにActionBarのタイトルが更新されないことがわかります...タイトル自体を更新するようにタイトルに指示することができます FragmentActivityからgetSupportActionBar()に直接アクセスすることはできません。また、完全に異なるリストアイテムを強調表示する必要があることをナビゲーションドロワーに何らかの方法で通知する必要もあります。 どっち?



私の解決策は以下です。

フラグメントからネイティブのActionBarとNavigation Drawerにアクセスするには、フラグメントを含むアクティビティと通信するためにリスナーを使用するのが最も論理的です。 ちなみに、 Google自身がこのような相互作用に対してこのソリューションを提案しています

アクティビティのタイトルは簡単に伝えられますが、フラグメントがどの特定のリスト項目を選択するのかナビゲーションドロワーに伝えることができますか? 彼がどこかから知っているように、彼の位置の番号を送信しますか?

タスクを複雑にしましょう-さらに、ナビゲーションドロワーの異なる位置で同じフラグメントを使用できるアクティビティがいくつかあります。 フラグメントから位置番号を直接送信することはありません。 そして、それは、松葉杖であるという見出しとは対照的に、すでに松葉杖であるので、良いことです。

一般に、すべてのフラグメントのタイプを使用して、どこかに定数を記述します(フラグメントファクトリに既に持っていました)。

 public static final int FRAGMENT_MAIN_CALENDAR = 1; public static final int FRAGMENT_MAIN_CATALOG = 2; public static final int FRAGMENT_MAIN_FAVORITES = 3; public static final int FRAGMENT_AUTHOR_ABOUT = 4; public static final int FRAGMENT_AUTHOR_STORIES = 5; 

そしてそれらをアクティビティに転送します。アクティビティは、このフラグメントが現在割り当てられているナビゲーションドロワーの位置を把握します。

そして、ヘッダーを送信する必要がありましたが、Activityで生成しませんでした。 フラグメントのコンテンツ(作成者の名前や公開ストーリーの名前など)に関連付けられていることもありますが、データベースに追加のクエリを生成したくありません。
一般的に、ここにインターフェースがあります:

 public interface OnFragmentChangedListener { public void onFragmentChanged(String title, int fragmentType); } 

Activityを実装し、メソッドを実装します。

 @Override public void onFragmentChanged(String title, int fragmentType) { switch (fragmentType) { case FragmentsFabrica.FRAGMENT_MAIN_CALENDAR : mDrawerList.setItemChecked(0, true); break; case FragmentsFabrica.FRAGMENT_MAIN_CATALOG : mDrawerList.setItemChecked(1, true); break; case FragmentsFabrica.FRAGMENT_MAIN_FAVORITES : mDrawerList.setItemChecked(2, true); break; } setTitle(title); } 

setTitleはGoogleの例です。
onAttachのフラグメント自体は、Activityをリスナーとして登録し、onCreateViewまたはonActivityCreatedで、そのフラグメント、個々のヘッダー、およびタイプを使用して呼び出します。

 onFragmentChangedListener.onFragmentChanged( getResources().getString(R.string.navigation_main_section1_title), FragmentsFabrica.FRAGMENT_MAIN_CALENDAR); 

しかし、解決できない問題が1つありました。 何らかの理由で、フラグメントを最後までフリップすると、アクティビティはスナックの空白の画面を表示し、もう一度戻るボタンを押すだけで閉じます。 さらに、この空白の画面では、長さがゼロの断片のスタック-イチジクで閉じることはできませんか? アクティビティに松葉杖を追加する必要がありました。

 @Override public void onBackPressed() { super.onBackPressed(); FragmentManager fm = getSupportFragmentManager(); if (fm.getBackStackEntryCount() == 0) this.finish(); } 

それが何に関連し、どのように問題を正しく解決するかはまだ不明です。

Source: https://habr.com/ru/post/J257383/


All Articles