15

Yeni CoordinatorLayout/AppBarLayout/CollapsingToolbarLayout paradigmasını kullanan bir parçam var ve çökmekte olan araç çubuğunun ne zaman tamamen genişletileceğini algılamak istiyorum, böylece bir işlem yapabilirim tüm parça üzerinde, örneğin, parçayı yığından atıp yeni bir tanesine gidip parçayı reddederek. İşten çıkarılmamış kod çalışmam var, sadece ne zaman ve ne zaman kullanmam gerektiğini bilmem gerek.AppBarLayout/CollapsingToolbarLayout tamamen genişletildiğinde algılama

AppBarLayout.OnOffsetChangedListener ile biraz deneme yaptım, ancak fazla şansı yoktu. Bir şeylerin ne zaman tamamen genişlediğini belirlemek için kullanmanın bir yolu var mı, yoksa birisinin bildiği daha çok tercih edilen bir yöntem var mı?

Şimdiden teşekkürler!

DÜZENLEME: Aynı zamanda, AppBarLayout.setExpanded(...) için bir çift uygulama olduğunu görüyorum, ancak AppBarLayout.getExpanded() veya benzer bir şey değil, ben de orada güldüm.

+0

belki appBarLayout.addOnOffsetChangedListener yardımcı olabilir ama ben propably ı doğru uygulamak vermedi adamcağız bulundu:

Yani herhangi bir zamanda sadece bir AppBarLayout genişletilmiş olup olmadığını belirlemek için bu kodu kullanabilirsiniz. – mstrengis

+0

Bunun için bir çözüm buldunuz mu? Bir ScrollRefreshLayout öğesinin, araç çubuğu kısmen daraltıldığında yenilenmesini engellemeye çalışırken aynı soruna girdim. – Jimeux

cevap

26

API'larda bir şey yok gibi görünüyor, ancak aşağıdakiler benim için çalışıyor gibi görünüyor. Test etmek gerekebilir.

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

Düzenleme: Yukarıdaki çözüm işe gibi görünüyor, ama ben appbar kaydırılan zaman bu durumu test etmek istedim çünkü ben OnOffsetChangedListener ile aşağıdaki çözümü kullanarak sona erdi.

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

} 
+0

İlk başta bunu neden yapmak istediğimin ardında yatan kavramdan vazgeçtim, ama sizin için çalıştığını söylediğinden cevabınızı kabul ediyorum. Teşekkürler! –

+0

Bu da benim için çalışıyor. Arayüzün uygulanmasını ekledi ancak –

+1

@ user1232726 olarak adlandırılmış gibi görünmüyor. Dinleyiciyi AppBarLayout'a eklemeniz gerekiyor. Kodu, bunu yapmanın bir yolu ile güncelledim. Potansiyel sızıntıları umursamıyorsanız, sadece 'appBarLayout.setOnScrollChangeListener (this)' seçeneğini kullanarak işi yapacağız. – Jimeux

6

Çözümüm özel görünüm oluşturmaya dayalıdır. belki içinde bir yöntemi çağırarak Sen Oluşturucu veya ayarlayarak yukarıdaki yapabilirsiniz

this.addOnOffsetChangedListener... 

: set Böyle bir addOnOffsetChangedListener sınıf içinde Sonra

public class CustomAppBar extends AppBarLayout { .... 

: İlk yerli AppBarLayout uzanan bir sınıf oluşturmak yapıcı.

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

Sonra bakış durumuna erişmek için, bu yüzden özel boolean oluşturmak: Yani yapıcı, xml eklenen edebilmek için 2 parametreleri içeren yapıcı kullanmayı unutmayın gerek görünümünüzü genişletilmiş veya daraltılmış başlamak durumunda özel görünüm sınıf içinde ve benim bakış varsayılan olarak bu durumda, doğru veya yanlış olarak ayarlayın genişletilmiş:

private boolean isExpanded = true; 

Artık o boolean durumunu güncellemek zorunda:

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

Sonraki adım CustomAppBar sınıfının içindeki bir alıcı kullanarak boolean durumunu elde etmektir

public boolean isExpanded() { 
     return isExpanded; 
    } 

sonraki aktivite olmanın veya Fragment sonra, sizin xml gidin orada özel görünümünüzü kullanmaktır olsun görünümü ve bunun belki biraz geç,

+0

Bu, bir "OnOffsetChangedListener" öğesini doğrudan "AppBarLayout" örneğine ekleyebileceğiniz bir overkill gibi görünüyor. –

+0

Bu AppBarLayout'u bir kez kullanacaksanız: evet öyle. Ancak, birden fazla etkinliğin AppBarLayout durumunu bilmesi gerekiyorsa, o zaman: bu bir DRY çözümüdür – cutiko

0

bildiğim AppBar durumunu bilmek yöntemini kullanın, ancak AppBArLayout kaynak kodunda keşfetmek ben AppBarLayout.OnOffsetChangedListener sadece değerini çevirir ki bulduk int getTopAndBottomOffset() Ap pBar Davranışı.

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