Parçalarda veya Aktivitede Araç Çubuğu ile Koordinatör Düzeni


95

Yeni tasarım kitaplığıyla, geliştirici isterse araç çubuğunun nasıl davranacağını çok değiştiren birkaç yeni düzen vardır. Farklı parçaların farklı davranışları ve amaçları olduğu için, örneğin önemli bir fotoğrafı gösteren daraltılan bir araç çubuğuna sahip bir galeri parçası veya araç çubuğunu gizlemek için uygulama çubuğu düzenine ihtiyaç duymayan bir kaydırma görünümü olmayan bir parça, etkinlikte tek bir araç çubuğuna sahip olmak zor olduğunu kanıtlayın.

Yani bununla, araç çubuğunu her parçaya taşımalı mıyım? Öyleyse, bir parçayı her gösterdiğimde supportActionBar'ı ayarlamalıyım ve ayrıca parçanın bağımsız doğasını geçersiz kılan parçadaki etkinliğin bir referansına sahip olmalıyım. Araç çubuğunu yalnızca Etkinlik içinde bırakırsam, her parçadaki her davranış türü için birden çok düzen tanımlamam gerekir. En iyi yaklaşım ne olurdu?


1
Merhaba, bir çözüm buldunuz mu?
SERG

2
Mevcut projem için Aktivitedeki araç çubuğuna bağlı kalmaya ve gerektiğinde uygun animasyonları yapmaya karar verdim. Ama biraz kıvrımlı. Her parçada araç çubuğu kullanmayı denedim ve iyi çalışıyor, ancak araç çubuğunu parça geçişleri arasında hareketlendirmek daha zor ve mümkün olup olmadığını bile bilmiyorum çünkü parça geçiş animasyonları konusunda fazla deneyimim yok.
mobilepotato7

buna yönelik herhangi bir güncelleme veya daha iyi çözümler var mı?
Sagar Nayak

Yanıtlar:


56

Bana gelince, her parçada uygulama çubuğu ve araç çubuğu olması çok garip geliyor. Bu yüzden, etkinlikte araç çubuğu olan tek bir uygulama çubuğuna sahip olmayı seçtim.

Bu sorunu CoordinatorLayout ile çözmek için, FrameLayoutvarsayılan davranışı geçersiz kılmak istediğiniz her bir parçadan parçaları tutması gereken farklı bir Layout (veya başka bir Layout) davranışını ayarlamanız gerekecektir .

Varsayılan davranışınızın şu olduğunu varsayalım: app:layout_behavior="@string/appbar_scrolling_view_behavior"

Sonra fragment_activity_layout.xml dosyanızda şöyle bir şey olabilir:

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

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/dashboard_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.Toolbar"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/dashboard_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>

Ve uygulamak istemediğiniz her parçada app:layout_behavior="@string/appbar_scrolling_view_behavior", geçersiz kılmanız onAttachve aşağıdakilerinizin onDetachdavranışını değiştirecek yöntemleri kullanmanız gerekecektir FrameLayout:

CoordinatorLayout.Behavior behavior;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if(behavior != null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    behavior = params.getBehavior();
    params.setBehavior(null);

}

@Override
public void onDetach() {
    super.onDetach();
    if(behavior == null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    params.setBehavior(behavior);

    layout.setLayoutParams(params);

    behavior = null;
}

Bundan sonra CoordinatorLayout, uygulama çubuğunu vb. Daraltmaz ve parça düzenlerinin tam yükseklikte olmasına izin verir.


Güzel olan, bunu denemek ve işleri basitleştirip kolaylaştırmadığını görmek zorunda kalacak. Teşekkürler.
mobilepotato7

Daha basit bir şey bulursan bana haber ver. Parçaların yaşam döngüsü boyunca herhangi bir anda koordinatör davranışını değiştirmenin mümkün olduğunu düşünüyorum (örneğin, normalde bazı şeyleri olan bir geri dönüştürücünüz var, ancak nadir durumlarda boş olabilir ve bunu yalnızca YükleyicininonLoadFinished mümkün olduğunu bilirsiniz. Burada hiçbir şeyin olmadığını bildiren ortalanmış görüntüyü göstermek ister, tıpkı Inbox Uygulamasında olduğu gibi), ancak bunu henüz denemedim. Belki bugün daha sonra.
Клаус Шварц

Tamam, bu oldukça iyi çalışıyor. Uygun olduğunda koordinatörü etkinleştirmek / devre dışı bırakmakla ilgilenen bir yardımcı oluşturdum, bu yüzden sadece enableCoordinator(Activity activity)/ disableCoordinator(Activity activity)parçalardan arıyorum .
Клаус Шварц

Yardımcınız nerede, @ КлаусØварц? Ne zaman arıyorsun?
santhyago

1
@santhyago Fragmanda
Клаус Шварц

8

İşte benim çözümüm

<!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout -->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <!-- Your fragment -->
    <include layout="@layout/content_main" />

</FrameLayout>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

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


1

Bu gerçekten iyi bir soru: a veya a içinde tutulacak Toolbargibi davranması gerekenler mi? Farklı soruları ve belgeleri araştırdıktan sonra tüm durumları kapsayan bir çözüm bulamadım. Bu nedenle, hangi yoldan gideceğiniz gerçekten durumunuza bağlıdır.ActionBarActivityFragment

Durum 1: Araç Çubuğu, ActionBar'ın yerini almalıdır

Araç Çubuğunun normal bir Eylem Çubuğu gibi davranması gerekiyorsa (veya zaman zaman en fazla 1 parça gösteriliyorsa), bence en iyi / en basit yol, Activitieskendi Araç Çubuğu ile geleneksel kullanmak ve Parçanızı oraya koymaktır. Bu şekilde, hangi Araç Çubuğunun ne zaman gösterilmesi gerektiği konusunda endişelenmenize gerek kalmaz.

Fragments'tan ActionBar'ı (-behaviour) değiştirmek de mümkündür, ancak bu sizi hangi Fragment'in ActionBar'ı ne zaman değiştirdiğini takip etmeye zorladığı için bunu tavsiye etmem. ActionBar'ın birden çok kez ayarlanıp ayarlanamayacağını bile bilmiyorum.

Durum 2: Her Parçanın kendi (bir parçası) Araç Çubuğu olmalıdır

Farklı bağımsız Araç Çubuklarını farklı Parçalara kendi eylemleriyle yerleştirmeyi de seçebilirsiniz. Bu şekilde, yan yana, her biri kendi Araç Çubuğunda kendi eylemlerine sahip farklı Parçalar görüntüleyebilir ve bunun 1 Araç Çubuğu olmasını önerebilirsiniz (belki de Gmail uygulaması gibi, emin değilim). Ancak bu, bu Araç Çubuklarını kendiniz şişirmeniz gerektiği anlamına gelir, ancak bu çok zor olmamalıdır.

Umarım bu seçim yapmanıza yardımcı olur.

(Herhangi bir (dil) hatası yaptıysam özür dilerim)


4
üzgünüm ama bu yeni tasarım kitaplığıyla ilgili sorunlara gerçekten cevap vermiyor. Araç çubuğunun eylem çubuğu olarak kullanılmasının amaç olduğundan emin olun, ancak farklı araç çubuğu türleri için birden çok koordinatör düzenine sahip olmak zor olabilir. Bulduğum şey, araç çubuğunu gerektiği gibi canlandırmanın mümkün olduğuydu. Yine de daha iyi test etmem gerekiyor ama görünüşe göre iyi sonuçlar var
mobilepotato7
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.