Tata Letak Koordinator dengan Toolbar di Fragmen atau Aktivitas

94

Dengan pustaka desain baru ada beberapa tata letak baru yang banyak mengubah bagaimana toolbar dapat berperilaku jika pengembang menginginkannya. Karena fragmen yang berbeda memiliki perilaku dan tujuan yang berbeda, misalnya fragmen galeri dengan toolbar yang menciut menampilkan foto penting, atau fragmen tanpa scrollview yang tidak memerlukan appbarlayout untuk menyembunyikan toolbar, memiliki satu toolbar dalam aktivitas dapat terbukti sulit.

Jadi dengan ini, haruskah saya memindahkan toolbar ke setiap fragmen? Jika demikian, saya harus menyetel supportActionBar setiap kali saya menampilkan fragmen dan juga memiliki referensi aktivitas dalam fragmen yang membatalkan sifat independen fragmen. Jika saya membiarkan bilah alat di Aktivitas sendirian, saya harus memiliki beberapa tata letak yang ditentukan untuk setiap jenis perilaku di setiap fragmen. Apa pendekatan terbaik?

mobilepotato7
sumber
1
Hai, sudah menemukan solusinya?
SERG
2
untuk proyek saya saat ini, saya telah memutuskan untuk tetap menggunakan bilah alat di Aktivitas dan melakukan animasi yang tepat bila diperlukan. Tapi ini agak berbelit-belit. Saya mencoba menggunakan toolbar di setiap fragmen dan berfungsi dengan baik, tetapi menganimasikan toolbar antara transisi fragmen lebih sulit dan saya bahkan tidak tahu apakah itu mungkin karena saya tidak memiliki banyak pengalaman dengan animasi transisi fragmen.
mobilepotato7
ada pembaruan atau solusi yang lebih baik untuk ini sekarang?
Sagar Nayak

Jawaban:

56

Bagi saya kedengarannya terlalu aneh untuk memiliki appbar dan toolbar di setiap fragmen. Jadi saya telah memilih untuk memiliki satu appbar dengan toolbar dalam aktivitas.

Untuk mengatasi masalah tersebut dengan CoordinatorLayout Anda harus menyetel perilaku berbeda dari Anda FrameLayout(atau Layout lainnya) yang seharusnya menyimpan fragmen dari setiap fragmen yang ingin Anda ganti perilaku defaultnya.

Mari kita asumsikan, bahwa perilaku default Anda adalah app:layout_behavior="@string/appbar_scrolling_view_behavior"

Kemudian di fragment_activity_layout.xml Anda mungkin memiliki sesuatu seperti itu:

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

Dan di setiap fragmen yang tidak ingin Anda implementasikan, app:layout_behavior="@string/appbar_scrolling_view_behavior"Anda harus mengganti onAttachdan onDetachmetode yang akan mengubah perilaku 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;
}

Setelah itu CoordinatorLayout tidak akan menciutkan appbar, dll. Dan akan memungkinkan tata letak fragmen menjadi tinggi penuh.

Клаус Шварц
sumber
Bagus, harus mencoba ini dan melihat apakah itu menyederhanakan banyak hal. Terima kasih.
mobilepotato7
Jika Anda akan menemukan sesuatu yang lebih sederhana - beri tahu saya. Saya pikir itu mungkin untuk mengubah perilaku koordinator setiap saat selama siklus hidup fragmen (misalnya Anda biasanya memiliki pendaur ulang dengan beberapa barang tetapi dalam kasus yang jarang terjadi mungkin kosong dan Anda akan tahu bahwa hanya setelah Loader onLoadFinished, Anda mungkin ingin menampilkan gambar tengah yang memberi tahu bahwa tidak ada apa pun di sini, seperti di Aplikasi Inbox), tapi saya belum mencobanya. Mungkin nanti hari ini.
Клаус Шварц
Oke, itu berfungsi dengan baik. Saya membuat helper yang menangani pengaktifan / penonaktifan koordinator jika diperlukan, jadi saya hanya memanggil enableCoordinator(Activity activity)/ disableCoordinator(Activity activity)dari fragmen.
Клаус Шварц
Dimana pembantu Anda, @ КлаусШварц? Kapan Anda menyebutnya?
santhyago
1
@santhyago Dalam Fragmen
Клаус Шварц
8

Inilah solusi saya

<!-- 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>

Charles-Eugene Loubao
sumber
1

Ini adalah pertanyaan yang sangat bagus: haruskah Toolbaryang perlu bertindak seperti ActionBardisimpan di a Activityatau a Fragment? Setelah mencari-cari di sekitar pertanyaan dan dokumentasi yang berbeda, saya tidak dapat menemukan solusi yang mencakup semua kasus. Oleh karena itu, itu sangat tergantung pada situasi Anda ke mana harus pergi.

Kasus 1: Toolbar harus menjadi pengganti ActionBar

Jika Toolbar harus berperilaku seperti ActionBar normal (atau jika maksimal 1 fragmen ditampilkan dari waktu ke waktu), menurut saya cara terbaik / paling sederhana adalah menggunakan tradisional Activitiesdengan Toolbar sendiri dan meletakkan Fragmen Anda di sana. Dengan cara ini Anda tidak perlu khawatir tentang kapan Toolbar harus ditampilkan.

Mengubah ActionBar (-behaviour) dari Fragment juga dimungkinkan, tetapi saya tidak akan merekomendasikannya, karena itu memaksa Anda untuk melacak Fragment mana yang mengubah ActionBar kapan. Saya bahkan tidak tahu apakah pengaturan ActionBar dapat dilakukan beberapa kali.

Kasus 2: Setiap Fragmen harus memiliki (bagian dari) Toolbar sendiri

Anda juga dapat memilih untuk meletakkan Bilah Alat yang berdiri sendiri di Fragmen berbeda, dengan tindakan mereka sendiri. Dengan cara ini Anda dapat menampilkan Fragmen yang berbeda di samping satu sama lain - masing-masing dengan tindakannya sendiri di Toolbar mereka - dan menyarankan bahwa itu adalah 1 Toolbar (mungkin seperti aplikasi Gmail, meskipun saya tidak yakin). Namun ini berarti Anda harus mengembangkan Toolbar itu sendiri, tetapi itu tidak terlalu sulit.

Saya harap ini akan membantu membuat pilihan.

(Maaf jika saya membuat kesalahan (bahasa-))

Coen B
sumber
4
maaf tapi ini tidak benar-benar menjawab masalah terkait dengan pustaka desain baru. Tentu memiliki bilah alat sebagai bilah tindakan adalah tujuannya, tetapi memiliki beberapa tata letak koordinator untuk berbagai jenis bilah alat bisa jadi rumit. Apa yang saya temukan adalah dimungkinkan untuk menganimasikan toolbar sesuai kebutuhan. Saya masih perlu mengujinya lebih baik tetapi tampaknya ada hasil yang baik
mobilepotato7