10

私には、私にはActivityのナビゲーションドロワーがあり、ToolbarActionBarなど)と同期しています。アクティビティには断片が少なく、異なるフラグメントでは異なるAppBarモード(1つは視差、もう1つはシンプル)を使用する必要があります。だから、私はCoordinatorLayoutをAppBarと内容でそれぞれ設定するべきだと思う。
しかし、私はDrawerとの同期を保存するために新しいツールバーの最後のツールバーをどのように置き換えることができますか?それは間違った方法で、私は別のものにする必要がありますか?フラグメントとナビゲーション用ツールバーの別のツールバー

答えて

-1

あなたのナビゲーション引き出し用DrawerLayoutNavigationViewを使用している場合は、私によると最善の解決策は、フラグメントレイアウトごとに個別DrawerLayoutを使用して、フラグメントごとに異なっDrawerLayoutの本体でAppBarLayoutを使用することです。

+1

これは唯一の解決策ですか?ほぼすべてのビュー階層を再接続する必要があります –

+0

AppBarLayoutはDrawerLayout本体の内部に埋め込まれたままであるため、親ビューではなくボディビューを変更しようとしていることを理解する必要があります。だからベストプラクティスは、レイアウトを再宣言することです。 NavigationViewがすべてのフラグメントで同一であれば、別のXMLレイアウトファイルに記述し、コードを短縮できるを使用できます。 –

+0

さて、ありがとう!ちょうど私は、このソリューションはフラグメントの切り替えに多くの時間がかかると思います。しかし、私はそれを使用します。 –

5

ない私のアプローチが良好であれば確かに、私は私の活動には、このパブリックメソッドを追加しようとしました:

public void setToolbar(Toolbar toolbar) { 
    if(toolbar != null) { 
     setSupportActionBar(toolbar); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 
    } else { 
     drawer.setDrawerListener(null); 
    } 
} 

と私はすべての断片でこれを追加しました:

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    ((MainActivity)getActivity()).setToolbar(toolbar); 
} 

@Override 
public void onDestroyView() { 
    ((MainActivity)getActivity()).setToolbar(null); 
    super.onDestroyView(); 
} 

それが正常に動作しています、メモリリークやその他のパフォーマンス上の問題が発生するかどうかはわかりません。多分誰かがそれを手伝うことができますか?

+0

私はこの問題を解決しました。 'layoutBar'のように' toolbar'を 'onCreateView'で設定し、それを' DrawerLayout'と同期させると、レイアウトレイアウトでは 'DrawerLayout'、フラグメントレイアウトでは' Toolbar'を使用します。 –

+0

そして、あなたの解決策はメモリリークがありません) –

+1

@Childフラグメント 'onCreateView'から' DrawerLayout'とどのように同期しているかを詳しく説明しますか? フラグメント 'Toolbar'ごとに' ActionBarDrawerToggle'を再作成していますか? 'DrawerLayout'コンストラクタを' Toolbar'と一緒に使うか使わないのですか? – jayeffkay

1

あなたは、次のコードのように、各FragmentからメインDrawerLayoutにアクセスすることができます:あなたはあなたが別の断片にナビゲーション引き出しに指定されたことをアプリケーションバー(ツールバー)を使用したい場合は、例えば、異なるオプションメニュー、

AppCompatActivity actionBar = (AppCompatActivity) getActivity(); 
    actionBar.setSupportActionBar(toolbar); 

    DrawerLayout drawer = (DrawerLayout) actionBar.findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      getActivity(), drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 
+0

アクティビティとフラグメントについて記述できますか?すべてのフラグメントに独自のツールバーがありますか、またはアクティビティを使用していますか?私はDrawerLayoutとNavigationViewのアクティビティを持っています。その中には、フラグメントが配置され、CoordinatorLayout、AppBarLayout、Toolbarが含まれていますが、ツールバーが変わったときにツールバーが表示されません。 – CoolMind

0

ナビゲーション・ドロワー・ロジックを指定したメイン・アクティビティーでパブリック・メソッドを作成することができます。その後、

public void setToolbar(Toolbar toolbar, String title){ 
    AppCompatActivity actionBar = this; 
    actionBar.setSupportActionBar(toolbar); 

    DrawerLayout drawer = (DrawerLayout)actionBar.findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toogle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
    drawer.addDrawerListener(toogle); 
    toogle.setDrawerIndicatorEnabled(true); 
    toogle.syncState(); 
    if(toolbar != null) 
     toolbar.setTitle(title); 
} 

今、あなたはメインツールバーにアクセスして、カスタムタイトル、オプションメニューでそれを無効にするために、あなたの断片で、このメソッドを使用することができます...あなたのフラグメントに新しいツールバーの変数を作成することによってこれを行うことができます とこの

toolbarFragment = (Toolbar)getActivity().findViewById(R.id.toolbar); 

R.id.toolbarようonCreateView方法でそれを膨らませることは、あなたのレイアウトファイルで指定されたツールバーのIDであり、それはあなたがメインツールバーのためのあなたの主な活動で使用したのと同じIDです。 は今、あなたはあなたがこのフラグメントのためのオプションメニューを使用する場合は、断片で

setHasOptionsMenu(true); 

を呼び出す必要があり、この

((MainActivity)getActivity()).setToolbar(toolbarFragment, "Some title"); 

のようなフラグメントには、メソッドSetToolbar関数(ツールバーツールバー、文字列のタイトル)を呼び出すことができますのonCreate ()またはonCreateView()メソッドを使用します。その後、あなたはこの

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.custom_menu1, menu); 
} 

のようにあなたが同様にあなたのナビゲーション引き出しの中に他のフラグメントのために、この手順を繰り返すことができます方法onCreateOptionsMenu()をオーバーライドすることができます。それは私のために働いていましたが、これがアクティビティやフラグメントライフサイクルに違反するのか、メモリリークを引き起こすのか分かりません。

+0

いいえ、男、それは問題ではありませんでした。私は、さまざまな断片に対して非常にフレックスで複雑なGUIを作成する必要がありました。それはappbarへの完全なアクセスを必要としました –

+0

私は視差ヘッダ、ナビゲーションパス(ファイルマネージャーのような)などで断片を持っていました。 –

関連する問題