web-dev-qa-db-ja.com

AppBarLayout / CollapsingToolbarLayoutが完全に展開されたときの検出

新しいCoordinatorLayout/AppBarLayout/CollapsingToolbarLayoutパラダイムを使用するフラグメントがあり、折りたたみツールバーが完全に展開されたことを検出して、その中にあるフラグメント全体に対して操作を実行できるようにしたいと考えています。フラグメントをスタックからポップして新しいフラグメントに移動し、フラグメントを閉じます。却下するコードが機能しているので、いつ、いつ使用しないかを知る必要があります。

AppBarLayout.OnOffsetChangedListener を少し試してみましたが、あまり運がありませんでした。それが完全に拡張されたときを決定するためにそれを使用する方法はありますか、または誰かが知っているより好ましい方法はありますか?

前もって感謝します!

編集: AppBarLayout.setExpanded(...) の実装もいくつかありますが、AppBarLayout.getExpanded()または同様の実装ではないため、困っています。

18
James Pizzurro

APIには何もないようですが、次のように機能しているようです。テストが必要な場合があります。

boolean fullyExpanded =
    (appBarLayout.getHeight() - appBarLayout.getBottom()) == 0;

編集:上記のソリューションは機能しているようですが、appbarがスクロールされたときにこの条件をテストしたかったので、OnOffsetChangedListenerで次のソリューションを使用することになりました。

class Frag extends Fragment implements AppBarLayout.OnOffsetChangedListener {

    private boolean appBarIsExpanded = true;
    private AppBarLayout appBarLayout;

    @Override 
    public void onActivityCreated(Bundle state) {
        super.onActivityCreated(state);
        appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar);
    }

    @Override
    public void onResume() {
        super.onResume();
        appBarLayout.addOnOffsetChangedListener(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        appBarLayout.removeOnOffsetChangedListener(this);
    }

    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        appBarIsExpanded = (verticalOffset == 0);
    } 

}
38
Jimeux

私のソリューションは、カスタムビューの作成に基づいています。最初に、ネイティブAppBarLayoutを拡張するクラスを作成します。

public class CustomAppBar extends AppBarLayout { ....

次に、クラス内で次のようにaddOnOffsetChangedListenerを設定します。

this.addOnOffsetChangedListener...

上記は、コンストラクタで設定するか、コンストラクタ内のメソッドを呼び出すことで実行できます。したがって、コンストラクタが必要ですxmlに追加できるように、2つのパラメータを持つコンストラクタを使用することを忘れないでください

public CustomAppBar(Context context, AttributeSet attrs) {
        super(context, attrs);
//You can set the listener here or maybe call the method that set the listener
}

次に、ビューの状態にアクセスする必要があるため、カスタムビュークラス内にプライベートブール値を作成し、ビューを展開または折りたたむ場合はtrueまたはfalseに設定します。この場合、ビューはデフォルトで展開されます。

private boolean isExpanded = true;

次に、そのブール値の状態を更新する必要があります。

this.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (verticalOffset == 0) {
                    isExpanded = true;
                } else {
                    isExpanded = false;
                }
            }
        });

次のステップは、CustomAppBarクラス内のゲッターを使用してブール値の状態を取得することです

public boolean isExpanded() {
        return isExpanded;
    }

次は、xmlに移動し、そこでカスタムビューを使用してから、ActivityまたはFragmentでビューを取得し、メソッドを使用してAppBarのステータスを確認します

7
cutiko

少し遅いかもしれませんが、私が見つけたAppBArLayoutのソースコードを調べると、AppBarLayout.OnOffsetChangedListenerint getTopAndBottomOffset()の値を変換するだけです= AppBarの動作。

したがって、いつでもこのコードを使用して、AppBarLayoutを展開するかどうかを定義できます。

public boolean isAppBArExpanded(AppBarLayout abl) {
    final CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).getBehavior();
    return (behavior instanceof AppBarLayout.Behavior) ? (((AppBarLayout.Behavior) behavior).getTopAndBottomOffset() == 0) : false;
}
5