web-dev-qa-db-ja.com

フラグメントとナビゲーションドロワー用の異なるツールバー

説明してください...ActivityにNavigationDrawerがあり、Toolbarと同期します(ActionBarなど)。アクティビティにはフラグメントがほとんどなく、フラグメントごとに異なるAppBarモードを使用する必要があります(1つは視差、もう1つは単純)。したがって、AppBarとコンテンツを使用して各フレームにCoordinatorLayoutを設定する必要があると思います。
しかし、Drawerとの同期を保存するために、newの最後のツールバーを置き換えるにはどうすればよいですか?またはそれは間違った方法であり、私はそれを別のものにする必要がありますか?

12
Шах

私のアプローチが良いかどうかはわかりませんが、このパブリックメソッドをアクティビティに追加しようとしました。

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

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

9
smbd uknow

次のコードのように、各DrawerLayoutからメインのFragmentにアクセスできます。

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();
2
Kosrat D. Ahmad