web-dev-qa-db-ja.com

プログラムで折りたたんだんだらまた展開するCollapsingToolbarLayout

簡単な質問ですが、答えが見つかりません。 CollapsingToolbarLayoutをプログラムで折りたたむまたは展開するにはどうすればよいですか?

collapsed toolbar

! ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

expanded toolbar

143
Tomas

Support Library v23を使用して、appBarLayout.setExpanded(true/false)を呼び出すことができます。

さらに詳しく: AppBarLayout.setExpanded(boolean)

283
jaxvy

ツールバーを折りたたむためにこのコードを使います。それを拡張する方法はまだ見つかりません。

public void collapseToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true);
    }
}

編集1:負の速度で同じ機能Y しかし、ツールバーは100%展開されていません 最後のパラメータはfalseで動作するはずです

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false);
    }
}

編集2:このコードは私のためにトリックを行います

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.setTopAndBottomOffset(0);
        behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]);
    }
}
  • setTopAndBottomOffsetはツールバーを展開します
  • onNestedPreScrollは展開されたツールバー内にコンテンツを表示します

自分で行動を実装しようとします。

48

あなたはそれがあなたのカスタムアニメーターでどのくらい拡大または縮小するかを定義できます。 setTopAndBottomOffset(int)を使うだけです。

これが一例です。

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    ValueAnimator valueAnimator = ValueAnimator.ofInt();
    valueAnimator.setInterpolator(new DecelerateInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
            appBar.requestLayout();
        }
    });
    valueAnimator.setIntValues(0, -900);
    valueAnimator.setDuration(400);
    valueAnimator.start();
}
22
Koho

私はAppBarLayoutに小さな拡張子を書きました。それはアニメーションの有無にかかわらずCollapsibleToolbarLayoutの拡張と折りたたみを可能にします。それは全く正しいことのようです。

試してみてください

AppBarLayoutの代わりにそれを使用するだけで、CollapsingToolbarLayoutの展開や折りたたみを担当するメソッドを呼び出すことができます。

私のプロジェクトでは期待通りに動いていますが、あなたのCollapsibleToolbarLayoutにぴったり合うようにperform...メソッド(特にperformExpandingWithAnimation())の中のfling/scroll値を微調整する必要があるかもしれません。

12
Bartek Lipinski

onNestedPreScrollで作業して私のようにエラーになることを望んでいる人のために。私はこの行なしでonCreateでNullPointerExceptionを取得します

    CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
    //below line
    params.setBehavior(new AppBarLayout.Behavior() {});

これでは正しく動作しません。しかし、私はこの問題を回避する

onCreateで:

        scrollToolbarOnDelay();

そして...

    public void scrollToolbarOnDelay() {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar);
                    CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent);
                    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
                    AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
         if(behavior!=null)
                    behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0});
         else
            scrollToolbarOnDelay()
                }
            }, 100);


        }
5
Sepehr

ツールバーを展開するにはmAppBarLayout.setExpanded(true)を、ツールバーを閉じるにはmAppBarLayout.setExpanded(false)を使います。

プログラム的にCollapsingToolbarLayout heightを変更したい場合はmAppBarLayout.setLayoutParams(params)を使用してください。

展開:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);

折りたたみ:

CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
4
Ferdous Ahamed

これを試して...

展開

appBarLayout.setExpanded(true, true);

思い出すために

appBarLayout.setExpanded(false, true);
0
Victor Sam VS

私はこれを使っています

 private fun collapseAppbar() {
        scrollView.postDelayed(Runnable {
            scrollView?.smoothScrollTo(50, 50)
        }, 400)
    }
0
denizs

これは展開したり折りたたんだりするのに役立ちます。

appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);
0
ROHIT LIEN