54

私が取り組んでいるアプリは、アクティビティに実装されているナビゲーション ドロワーで構成されています。アクティビティのレイアウトは次のとおりです。

<FrameLayout 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:layout_width="match_parent"
    android:layout_height="match_parent">

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <include
            android:id="@+id/appbar"
            layout="@layout/appbar" />

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

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/header_drawer"
        app:menu="@menu/menu_nav">
    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

</FrameLayout>

これは非常に一般的なパターンです。頻繁に変更されるのは、コンテナ レイアウト内の Fragment だけです。

いずれかの Fragment にスクロール要素がある場合、スクロール時に、CoordinatorLayout は Toolbar/AppBarLayout を含む位置の変換を喜んで行います。

ここでの本当の問題は、フラグメントが置き換えられると、ツールバーの位置が同じままになることです。つまり、ツールバーが非表示の場合、意図しないままになります。

結果は次のとおりです。

これ:

スクロール後

行き詰まる:

次に変更

この場合、ツールバーの位置をリセットするにはどうすればよいですか?

編集: バグの可能性があります。AppBarLayout オフセット変更リスナーは、アプリを再起動する ([戻る] ボタンを押してアプリを開く) ときにのみ呼び出され、激しいフリングの後に再度呼び出されるのを停止します。

4

9 に答える 9

48

スクロール状態をリセットするには、AppBarLayout.Behaviorオブジェクトを取得するだけです

CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.coordinator);
AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbar.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();       

onNestedPreScrollメソッドを手動で呼び出します。

int[] consumed = new int[2];
behavior.onNestedPreScroll(coordinator, appbar, null, 0, -1000, consumed);

アニメーションでスムーズにリセットしたい場合は、onNestedFling代わりに次の呼び出しを試すことができます。

behavior.onNestedFling(coordinator, appbar, null, 0, -1000, true);
于 2015-06-09T10:25:58.030 に答える
39

最初に MainActivity で AppBarLayout 参照を取得し、次に置き換えられるフラグメントの一時停止状態で、以下のメソッドを使用して toolbar を展開します。

MainActivity.appbar.setExpanded(true,true);

またはツールバーを閉じるには:

MainActivity.appbar.setExpanded(false,true);

2 番目のパラメーターは、ツールバーをスムーズにスクロールするために使用されます。

于 2015-10-23T11:59:23.160 に答える
13

サポート ライブラリを v23 に更新すると、以下を使用できます。

appBarLayout.setExpanded(true/false);

public void setExpanded (ブーリアン展開)

この AppBarLayout が展開されているかどうかを設定し、既にレイアウトされている場合はアニメーション化します。

AppBarLayout のスクロールと同様に、このメソッドは、このレイアウトが CoordinatorLayout の直接の子であることに依存しています。

レイアウトを完全に展開 する場合は true、完全に折りたたむ場合は false

于 2015-12-03T14:57:10.023 に答える
2

フラグメントの変更前にこのコードを使用しています。

scrollingElement.startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
scrollingElement.dispatchNestedPreScroll(0, -Integer.MAX_VALUE, null, null);
scrollingElement.stopNestedScroll();
于 2015-06-07T16:43:22.683 に答える
2

ドキュメントが言ったよう に

AppBarLayout は
void setExpanded (boolean expand、boolean animate) をサポートしています。
この AppBarLayout が展開されているかどうかを設定します。

  • Expanded boolean: レイアウトを完全に展開 する必要がある場合は true、完全に折りたたむ必要がある場合は false
  • animate boolean: 新しい状態にアニメーション化するかどうか

まず、必要なのが

AppBarLayout appBarLayout = findViewById(R.id.appBarLayout);

次に、レイアウト を展開します

appBarLayout.setExpanded(true, true); // with animation
appBarLayout.setExpanded(true, false); // without animation  

レイアウト を折りたたむ

appBarLayout.setExpanded(false, true); // with animation
appBarLayout.setExpanded(false, false); // without animation 
于 2018-02-14T17:20:36.143 に答える