新しいナビゲーションコンポーネントの提案されたプラクティスは、I/Oで次のテンプレートと提案された哲学とともに提示されました。
典型的なアプリには、多くの場合、CollapsingToolbarを含む詳細ビューがあります。そのアーキテクチャの下でそれをどのように構築しますか?
典型的なアプリには、多くの場合、CollapsingToolbarを含む詳細ビューがあります。そのアーキテクチャの下でそれをどのように構築しますか?
すばらしい質問です。私もこれに少し苦労し、NavHostFragmentを持つアクティビティが1つ、理想的には他に何もないはずであるという結論に達しました。これにより、各画面に必要なすべてを表示する(または表示しない)ための究極の柔軟性が得られます。重要なのは、テーマがActionBarを削除することを確認してください。
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
次の質問につながります...
ツールバーを各フラグメントXMLに移動しますか?
私の意見では、うん!通常ActionBarを使用するすべてのことは、ツールバーを介して行うことができます。これは、ツールバーを使用して、過去にActionBarを使用した最も重要なこと(上方向のナビゲーション、タイトル、オプションメニューなど)を実行する方法を示す簡単なスニペットです。
toolbar.apply {
setNavigationOnClickListener { findNavController().navigateUp() }
setTitle(R.string.toolbar_title)
inflateMenu(R.menu.fragment_menu)
setOnMenuItemClickListener(::onMenuItemClick)
}
折りたたみツールバーをプログラムで実装しますか?
それはまさにあなたが何をしようとしているのかに依存しますが、ほとんどの場合、その必要はありません。 AppBarLayout、CollapsingToolbarLayout、およびToolbarをレイアウトにドロップして、通常と同じように使用できます。 AppBarLayoutにActionBarテーマオーバーレイを提供します。次に例を示します。
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/coordinatorLayout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<com.google.Android.material.appbar.AppBarLayout
Android:id="@+id/appBarLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">
<com.google.Android.material.appbar.CollapsingToolbarLayout
Android:id="@+id/collapsingToolbarLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:contentScrim="@color/primary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<androidx.appcompat.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:navigationIcon="@drawable/ic_up_white"/>
...
詳細フラグメントを独自のアクティビティに移動し(とにかく独自のディープリンクを使用する場合があります)、哲学を「破壊」しますか?
上記ではそれは必要ありませんよね?これは、1つのナビゲーショングラフで複数のレベルに簡単に対応できるだけでなく、グラフ内のすべての宛先の外観と動作(ActionBarのような機能を含む)をカスタマイズできる十分に柔軟なアプローチです。
試す
appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
if(expandToolbar){
appBarLayout.setExpanded(true,true);
}else{
appBarLayout.setExpanded(false,true);
}
これは通常のリンクです 特定のフラグメントに対してCollapsingToolbarLayoutの展開を無効にする
また、toolBarの一部を変更し始めている他のユーザーは、カスタムツールバービューを個別のXMLで記述し、詳細でカスタムビューを膨らませ、フラグメントがある場合は、古いツールバーの未使用の要素を非表示にします。
setSupportActionBar(toolbar);
View logo = getLayoutInflater().inflate(R.layout.view_logo, null);
toolbar.addView(logo);
これが不要なビューを非表示にする方法です
for (int i = 0; i < toolbar.getChildCount(); ++i) {
View child = toolbar.getChildAt(i);
// here u can hide all text views for example.
if (child instanceof TextView) {
child.setVisibility(View.GONE );
}
}
この方法は、2つのアクティビティを作成するよりもはるかに優れています
我々が持っていると仮定しましょう
アプリに必要なすべてのツールバーの外観は、その単一のツールバーに実装され、現在アクティブなフラグメントである必要があります。依存関係の逆転の原則に違反しないために、アクティビティのツールバーの機能を必要とするすべてのフラグメントは、インターフェースを実装する必要があります。 OnBackStackChangedListenerを使用して、ビューの更新を確認できます
getFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment visibleFragment = ...
if(visibleFragment instanceof ToolbarControlFragment) {
if(visibleFragment.shouldExpandToolbar()) {
// set AppBarLayout expanded state
}
// ...
}
}
}
);
FragmentがOptionsMenuを必要とする場合、その原則を覚えているかもしれません。
私は通常、アクティビティによって制御される1つだけの下部ナビゲーションバーと、フラグメント内のいくつかのツールバーを持つことをお勧めします。これにより、複雑さが軽減され、アプリのコンポーネントがより独立します。