Dzięki nowej bibliotece projektów dostępnych jest kilka nowych układów, które bardzo zmieniają sposób zachowania paska narzędzi, jeśli programista sobie tego życzy. Ponieważ różne fragmenty mają różne zachowania i cele, na przykład fragment galerii ze zwijanym paskiem narzędzi pokazującym ważne zdjęcie lub fragment bez widoku przewijania, który po prostu nie potrzebuje appbarlayout do ukrycia paska narzędzi, posiadanie jednego paska narzędzi w działaniu może okazują się trudne.
Czy w związku z tym powinienem przenieść pasek narzędzi do każdego fragmentu? Jeśli tak, to za każdym razem, gdy pokazuję fragment, muszę ustawić supportActionBar, a także mieć odniesienie do aktywności we fragmencie, co unieważnia niezależny charakter fragmentów. Jeśli zostawię pasek narzędzi w samym działaniu, muszę mieć zdefiniowane wiele układów dla każdego typu zachowania w każdym fragmencie. Jakie byłoby najlepsze podejście?
źródło
Odpowiedzi:
Jak dla mnie brzmi to zbyt dziwnie, aby mieć pasek aplikacji i pasek narzędzi w każdym fragmencie. Więc zdecydowałem się mieć pojedynczy pasek aplikacji z paskiem narzędzi w aktywności.
Aby rozwiązać ten problem za pomocą CoordinatorLayout, będziesz musiał ustawić inne zachowanie swojego
FrameLayout
(lub dowolnego innego układu), który powinien przechowywać fragmenty z każdego fragmentu, który chcesz przesłonić domyślne zachowanie.Załóżmy, że domyślne zachowanie to
app:layout_behavior="@string/appbar_scrolling_view_behavior"
Wtedy w twoim fragment_activity_layout.xml możesz mieć coś takiego:
<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>
I w każdym fragmencie, którego nie chcesz implementować
app:layout_behavior="@string/appbar_scrolling_view_behavior"
, będziesz musiał nadpisaćonAttach
ionDetach
metody, które zmienią zachowanie twojegoFrameLayout
: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; }
Po tym CoordinatorLayout nie zwinie paska aplikacji itp. I pozwoli na układy fragmentów na pełną wysokość.
źródło
onLoadFinished
możliwe, że lubię wyświetlać wyśrodkowany obraz z informacją, że nic tu nie ma, tak jak w aplikacji Inbox), ale jeszcze tego nie próbowałem. Może później dzisiaj.enableCoordinator(Activity activity)
/disableCoordinator(Activity activity)
z fragmentów.Oto moje rozwiązanie
<!-- 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>
źródło
To naprawdę dobre pytanie: czy
Toolbar
to powinno zachowywać się jakActionBar
trzymany w aActivity
czy aFragment
? Po przeszukaniu różnych pytań i dokumentacji nie mogłem znaleźć rozwiązania obejmującego wszystkie przypadki. Dlatego tak naprawdę zależy to od Twojej sytuacji.Przypadek 1: Pasek narzędzi musi być zamiennikiem ActionBar
Jeśli pasek narzędzi ma zachowywać się jak normalny pasek akcji (lub jeśli od czasu do czasu wyświetlany jest maksymalnie 1 fragment), myślę, że najlepszym / najprostszym sposobem jest użycie tradycyjnego
Activities
z własnym paskiem narzędzi i umieszczenie tam swojego fragmentu. W ten sposób nie musisz się martwić, kiedy pasek narzędzi ma zostać wyświetlony.Zmiana ActionBar (-behaviour) z Fragments jest również możliwa, ale nie polecam tego, ponieważ zmusza cię to do śledzenia, który Fragment zmienił ActionBar i kiedy. Nie wiem nawet, czy ustawienie ActionBar można wykonać wiele razy.
Przypadek 2: Każdy fragment powinien mieć własny (część) paska narzędzi
Możesz także umieścić różne samodzielne paski narzędzi w różnych fragmentach, z ich własnymi akcjami. W ten sposób możesz wyświetlać różne fragmenty obok siebie - każdy z własnymi akcjami na swoim pasku narzędzi - i zasugerować, że jest to 1 pasek narzędzi (może podobnie jak aplikacja Gmail, chociaż nie jestem pewien). Oznacza to jednak, że musiałbyś sam nadmuchać te paski narzędzi, ale nie może to być zbyt trudne.
Mam nadzieję, że pomoże to w dokonaniu wyboru.
(Przepraszam, jeśli popełniłem jakieś (językowe) błędy)
źródło