Programlı olarak daralt veya genişlet CollapsingToolbarLayout


159

Basit bir soru, ama cevap bulamıyorum. CollapsingToolbarLayoutProgramlı olarak nasıl daraltabilirim veya genişletebilirim ?

daraltılmış araç çubuğu

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

genişletilmiş araç çubuğu


1
Aynı şeyi merak ediyordum. Kullanıcı katıştırılmış düzeni (ör. Resim) tıkladığında araç çubuğunu tam ekrana genişletmek de ilginç olabilir.
Moritz

Yanıtlar:


322

Destek Kitaplığı v23'ü kullanarak arayabilirsiniz appBarLayout.setExpanded(true/false).

İlave okumalar: AppBarLayout.setExpanded (boolean)


2
Tamam, bahşiş için teşekkür ederim, ancak destek libs v23 çok adamcağız, bu yüzden şimdi test edemiyorum, çünkü 22.2.1'de kalmam gerekiyor ....
Tomas

Şimdi bazı düzeltmeler ile 23.0.1 var
Mario Velasco

6
Destek kütüphaneleri 23.1.1 ile özel bir animasyon tanımlamak mümkün mü? setExpanded (boolean, true) hav çok yavaş bir animasyon ...
Nifhel

Katlanabilir bir araç çubuğuna ve altında bir geri dönüşüm görünümüne sahip bir düzenim olduğunda bir sorunum vardı. Geri dönüşüm görünümünden öğeleri silerken araç çubuğu uygun davranmadı, bu yüzden uygulama çubuğu düzenini genişletir ve düzgün çalıştı. Animasyon için appBarLayout.setExpanded (true, true) kullanarak sona erdi.
Ray Hunter

48

Araç çubuğunu daraltmak için bu kodu kullanıyorum. Hala genişletmenin bir yolunu bulamıyorum.

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);
    }
}

Düzenleme 1: Negatif hız Y ile aynı işlev ancak araç çubuğu% 100 genişletilmedi ve son parametre için yanlış çalışmalıdır

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);
    }
}

Edit 2: Bu kod benim için hile yapar

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 araç çubuğunu genişletir
  • onNestedPreScroll genişletilmiş araç çubuğundaki içeriği gösterir

Davranışı kendim uygulamaya çalışacağım.


2
Eğer son parametre ayarlarsanız Düzenleme 1 de çalışacaktır onNestedFlingiçin false.
Ricky Lee

2
params.getBehavior () null döndürüyor. Xml'de, layout_behaviour etiketi AppBarLayout'ta değil, NestedScrollView kardeşinde ayarlanır. Bana yardım eder misiniz?
Kullanıcı31689

Teşekkür ederim. Son parametre yanlışsa, Düzenleme 1 düzgün çalışır. :)
Sirelon

@ GobletSky Aynı sorunla karşılaştım. Benim parça NestedScrollView vardı ve parçayı ayarlamadan onNestedFling önce aramaya çalıştım . Parçayı ayarladıktan sonra yöntemi başarıyla çağırabilirim.
usp

@usp Aslında, sorunum tamamen farklıydı (biraz noobish hatası).
Şuna

27

Özel animatörünüzle ne kadar genişleyeceğini veya daraltılacağını tanımlayabilirsiniz. Sadece setTopAndBottomOffset(int).

İşte bir örnek:

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();
}

2
Özel bir ofsete animasyon eklemenizi sağlayan tek cevap budur. Çok teşekkürler!
Guilherme Torres Castro

2
appBar.setExpanded (yanlış, doğru); (open / close, canlandır) Tüm bu satırları yazmanıza gerek yok
Puni

2
"Özel" bir ofsete genişletmek / daraltmak istiyorsanız (birden çok aşama daraltma gibi) buna ihtiyacınız olacaktır.
威 其 威

Eğer u özel davranış yazmak istemiyorsanız bu AppBar ofset animasyon için en iyi çözümdür. Kod snippet'indeki bir güncelleştirme, geçerli appbar ofsetinden animasyonu başlatmak için value yerine 0 yerine value.imaAtor.setIntValues ​​() öğesini çağırmaktır.
makara

Bir özel değişken kullanmak için ( -900 )ayarlamak için valueAnimator.setIntValuesdaha iyi bir çözüm olduğunu kullanmaktır- ( appBar.getTotalScrollRange() )
Ali Rezaiyan

12

Küçük bir uzantı yazdım AppBarLayout. CollapsibleToolbarLayoutAnimasyonlu ve animasyonsuz ikisinin genişlemesine ve daraltılmasına izin verir . Oldukça doğru yapıyor gibi görünüyor.

Denemek için çekinmeyin.

Sadece yerine kullanın AppBarLayout, ve genişletmek veya daraltmaktan sorumlu yöntemleri çağırabilirsiniz CollapsingToolbarLayout.

Projemde tam olarak beklendiği gibi çalışıyor, ancak perform...yöntemlerinizdeki (özellikle de performExpandingWithAnimation()) fırlatma / kaydırma değerlerini mükemmel şekilde ayarlamanız gerekebilir CollapsibleToolbarLayout.


@ ssdeno lütfen Github gistinin Benioku.md dosyasını okuyun. Destek kütüphanesinin v23 sürümünden bu yana kullanımdan kaldırılmıştır. Destek v23 beri (AndroidX devam), içinde setExpandedyöntemi vardır AppBarLayout.
Bartek Lipinski

6

mAppBarLayout.setExpanded(true)Araç Çubuğunu genişletmek için kullanın ve Araç Çubuğunu mAppBarLayout.setExpanded(false)daraltmak için kullanın .

CollapsingToolbarLayout yüksekliğini programlı olarak değiştirmek istiyorsanız mAppBarLayout.setLayoutParams(params);

Expand:

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

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

Çöküş:

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

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

1
Bu bana çok yardımcı oldu.
NoName

1
Bu çok yardımcı oldu. Teşekkür ederim!
sunlover3

5

onNestedPreScroll ile çalışmak ve benim gibi hata almak isteyenler için. Bu çizgi ile onCreate içinde NullPointerException olsun

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

ve bununla düzgün çalışmıyor. ama ben bu soruna geçici bir çözüm bulmak

onCreate içinde:

        scrollToolbarOnDelay();

ve...

    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);


        }

1

Bunu dene...

genişletmek

appBarLayout.setExpanded(true, true);

Hatırlamak için

appBarLayout.setExpanded(false, true);

0

Bu, genişletmeye veya daraltmaya yardımcı olabilir:

appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);

0

bunu kullanıyorum

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

0

AppBarLayout'u programlı olarak genişletmek / daraltmak için:

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.