フラグメントまたはアクティビティのツールバーを使用したコーディネーターレイアウト


94

新しいデザインライブラリには、開発者の希望に応じてツールバーの動作を大きく変えるいくつかの新しいレイアウトがあります。フラグメントによって動作や目的が異なるため、たとえば、重要な写真を表示する折りたたみツールバーのあるギャラリーフラグメントや、ツールバーを非表示にするためにappbarlayoutを必要としないscrollviewのないフラグメントの場合、アクティビティに単一のツールバーがあると、難しいことを証明します。

これで、ツールバーを各フラグメントに移動する必要がありますか?その場合、フラグメントを表示するたびにsupportActionBarを設定する必要があり、フラグメントの独立した性質を無効にするフラグメント内のアクティビティの参照も必要です。ツールバーをアクティビティに残したままにすると、各フラグメントの動作のタイプごとに複数のレイアウトを定義する必要があります。最善のアプローチは何でしょうか?


1
こんにちは、あなたは解決策を見つけましたか?
SERG 2015

2
現在のプロジェクトでは、アクティビティのツールバーを使い続け、必要に応じて適切なアニメーションを実行することにしました。しかし、少し複雑です。各フラグメントでツールバーを使用してみましたが、正常に機能しますが、フラグメントの遷移間でツールバーをアニメーション化するのはより難しく、フラグメントの遷移アニメーションの経験があまりないため、可能かどうかさえわかりません。
mobilepotato7 2015

これに対する更新またはより良い解決策はありますか?
Sagar Nayak 2018年

回答:


56

私にとっては、各フラグメントにappbarとtoolbarを持つのは奇妙に思えます。そのため、アクティビティにツールバーを含む単一のappbarを選択しました。

CoordinatorLayoutでこの問題を解決するには、FrameLayoutデフォルトの動作を上書きしたい各フラグメントのフラグメントを保持することになっている(または他のレイアウト)の異なる動作を設定する必要があります。

デフォルトの動作が app:layout_behavior="@string/appbar_scrolling_view_behavior"

次に、fragment_activity_layout.xmlに次のようなものがあるとします。

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/dashboard_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.Toolbar"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/dashboard_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>

そして、各フラグメントにあなたは実装しないことを望むapp:layout_behavior="@string/appbar_scrolling_view_behavior"あなたがオーバーライドする必要がありますonAttachし、onDetachあなたの行動を変更するメソッドFrameLayout

CoordinatorLayout.Behavior behavior;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if(behavior != null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    behavior = params.getBehavior();
    params.setBehavior(null);

}

@Override
public void onDetach() {
    super.onDetach();
    if(behavior == null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    params.setBehavior(behavior);

    layout.setLayoutParams(params);

    behavior = null;
}

その後、CoordinatorLayoutはappbarなどを折りたたまず、フラグメントレイアウトをフルハイトにすることができます。


いいもの、これを試して、それが物事を単純化するかどうかを確認する必要があります。ありがとう。
mobilepotato7 2015

もっと簡単なものが見つかれば、教えてください。私は断片のライフサイクル中の任意の時点で、コーディネーターの動作を変更することは可能だと思います(たとえば、あなたが正常にいくつかのものとリサイクルを持っていますが、まれにそれが空であるかもしれないとだけLoaderの後ことを知ってu'll onLoadFinished、それはあなたがしたいことも可能です何もないことを通知する中央の画像を表示したい(Inboxアプリの場合と同様))が、まだ試していません。たぶん今日は後で。
КлаусШварц

OK、それはかなりうまくいきます。必要に応じてコーディネーターの有効化/無効化を処理するヘルパーを作成したので、フラグメントからenableCoordinator(Activity activity)/ disableCoordinator(Activity activity)を呼び出すだけです。
КлаусШварц

@КлаусШварц、あなたのヘルパーはどこですか?いつ呼びますか?
santhyago 2015年

1
フラグメントで@santhyago
КлаусШварц

8

これが私の解決策です

<!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout -->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <!-- Your fragment -->
    <include layout="@layout/content_main" />

</FrameLayout>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>


1

これは本当に良い質問です:be またはaに保持されるToolbarように動作する必要があるs はActionBarActivityFragmentますか?さまざまな質問やドキュメントを検索した結果、すべてのケースをカバーする解決策を見つけることができませんでした。したがって、それは本当にあなたの状況に依存します。

ケース1:ツールバーはActionBarの代替品でなければならない

ツールバーが通常のActionBarのように動作する必要がある場合(または、最大1のフラグメントが時々表示される場合)は、Activities独自のツールバーでトラディショナルを使用し、そこにフラグメントを配置するのが最良または最も簡単な方法だと思います。これにより、どのツールバーをいつ表示する必要があるかを気にする必要がなくなります。

ActionBar(-behaviour)をFragmentsから変更することも可能ですが、どのFragmentがいつActionBarを変更したかを追跡する必要があるため、お勧めしません。ActionBarの設定を複数回実行できるかどうかもわかりません。

ケース2:各フラグメントには独自の(一部の)ツールバーが必要です

また、独自のアクションを使用して、異なるスタンドアロンツールバーを異なるフラグメントに配置することもできます。このようにして、ツールバーに独自のアクションを持つさまざまなフラグメントを並べて表示し、それが1つのツールバーであることを示唆できます(多分、Gmailアプリのようですが、よくわかりません)。ただし、これは自分でこれらのツールバーを膨らませる必要があることを意味しますが、それほど難しくはないはずです。

これが選択に役立つことを願っています。

((言語)の間違いがあった場合は申し訳ありません)


4
申し訳ありませんが、これは新しいデザインライブラリに関連する問題には実際には対応していません。確かに、ツールバーをアクションバーとして使用することが目的ですが、異なるタイプのツールバーに対して複数のコーディネーターレイアウトを使用するのは難しい場合があります。私が見つけたのは、必要に応じてツールバーをアニメーション化できることです。私はまだそれをよりよくテストする必要がありますが、良い結果があるようです
mobilepotato7
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.