Cum se utilizează foile inferioare cu Biblioteca de suport pentru proiectare

Una dintre cele mai importante schimbări ale designului Android a fost introdusă în cadrul conferinței I / O Google 2014, proiectarea materialelor. Chiar dacă Google a introdus un set de linii directoare pentru noua lor filozofie de design, dezvoltatorii au fost responsabili pentru implementarea noilor modele de la zero.

Acest lucru a dus la multe biblioteci de terțe părți care au atins obiectivele de design material cu implementări similare, dar diferite. Pentru a ajuta la atenuarea unei dureri de dezvoltare a designului materialului, Google a introdus biblioteca de suport pentru design în timpul prezentării conferinței Google I / O din 2015.

La fel ca în multe lucruri în dezvoltarea de software, biblioteca de suport a proiectului sa îmbunătățit cu timpul, adăugând suport pentru foile de fund cu versiunea 23.2. În acest articol, învățați să implementați cu ușurință modelul foaie de fund în propriile aplicații. Un exemplu de proiect pentru acest articol poate fi găsit pe GitHub.

1. Setarea unei foi de fund

Pentru a implementa foaia inferioară, aveți două opțiuni, o vizualizare cu un container BottomSheetBehavior în fișierul de aspect sau a BottomSheetDialogFragment. Pentru a utiliza fie, trebuie să importați biblioteca de suport de proiectare în proiectul dvs., cu o versiune minimă de 23.2. Puteți face acest lucru build.gradle prin includerea liniei de mai jos dependențe:

compile 'com.android.support:design:23.2.0'

Odată ce ați sincronizat proiectul cu biblioteca de suport pentru proiectare, puteți deschide fișierul de aspect care trebuie să includă o foaie inferioară. În exemplul nostru de proiect, folosesc următorul XML, care afișează trei butoane în activity_main.xml.

   

Când rulează pe un dispozitiv, aspectul arată astfel:

Există câteva puncte-cheie în fișierul de aspect pe care trebuie să le cunoașteți. Pentru a utiliza widgetul pentru foi de fund, trebuie să utilizați a CoordinatorLayout container pentru vizualizări. Spre sfârșitul fișierului, observați că există o a NestedScrollView conținând a TextView. În timp ce orice vizualizare a containerului poate fi utilizată într-o coală de fund, derularea poate avea loc numai dacă utilizați un container care acceptă defilare nested, cum ar fi NestedScrollView sau a RecyclerView.

Pentru ca un container să fie recunoscut de biblioteca suport pentru proiect ca un container de foaie inferioară, trebuie să includeți layout_behavior atribuiți și dați-i o valoare android.support.design.widget.BottomSheetBehavior. Puteți vedea acest lucru folosit mai sus în NestedScrollView.

Un alt atribut cheie care trebuie notat pentru containerul de foaie inferioară este layout_height. Indiferent de dimensiunile pe care le utilizează elementul de container, controlează modul în care este afișată foaia de fund. Există o avertizare care trebuie să fie conștientă de înălțimea colii inferioare. Dacă utilizați CoordinatorLayout, pentru a muta altele Vedere obiecte în jur, cum ar fi cu CollapsingToolbarLayout, apoi se modifică înălțimea foii inferioare. Acest lucru poate provoca un efect nedorit de sărituri.

2. Afișarea unei foi de fund bazate pe aspect

După ce ați adăugat un container de vizualizare și l-ați setat corect în fișierul de aspect, puteți deschide Activitate sau Fragment care folosește foaia inferioară. În proba de proiect, aceasta este MainActivity.java.

Pentru ca foaia inferioară să fie afișabilă, trebuie să creați o BottomSheetBehavior. Acest lucru este creat prin obținerea unei trimiteri la vizualizarea și apelarea containerului BottomSheetBehavior.from () pe acel container. Pentru această probă, menționați și cele trei butoane din aspect și apel setOnClickListener () pe ei.

private BottomSheetBehavior mBottomSheetBehavior; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); Vizualizare bottomSheet = findViewById (R.id.bottom_sheet); Buton buton1 = (buton) findViewById (R.id.button_1); Butonul buton2 = (Buton) findViewById (R.id.button_2); Butonul buton3 = (Buton) findViewById (R.id.button_3); button1.setOnClickListener (aceasta); button2.setOnClickListener (aceasta); button3.setOnClickListener (aceasta); mBottomSheetBehavior = BottomSheetBehavior.from (bottomSheet); 

Acum că ați creat o BottomSheetBehavior, ultimul lucru pe care trebuie să-l faceți este să arătați foaia de jos Vedere. Puteți face acest lucru prin setarea stării dvs. BottomSheetBehavior la STATE_EXPANDED, pe care o facem în aplicația de probă atunci când este partea de sus Buton este făcută clic pe.

@Override public void onClick (V) switch (v.getId ()) caz R.id.button_1: mBottomSheetBehavior.setState (BottomSheetBehavior.STATE_EXPANDED); pauză; 

După ce ați terminat, aplicația dvs. ar trebui să arate astfel:

Pentru a ascunde foaia inferioară, utilizatorul o poate deplasa în jos pentru al ascunde de pe ecran sau puteți seta BottomSheetBehavior la STATE_COLLAPSED.

3. Peeking o foaie inferioară

Este posibil să fi observat în diferite aplicații Android și widget-uri de la Google, cum ar fi Pickerul de locație din API-ul Locații, că modelul de coli inferior este utilizat pentru a afișa o previzualizare a foii inferioare care poate fi extinsă pentru mai multe detalii. Acest lucru poate fi realizat cu foaia inferioară a bibliotecii suport pentru proiectare prin setarea mărimii restrânse a fișierului Vedere cu setPeekHeight () metodă. Dacă doriți să afișați versiunea mai scurtă a foii inferioare, puteți seta BottomSheetBehavior la STATE_COLLAPSED.

mBottomSheetBehavior.setPeekHeight (300); mBottomSheetBehavior.setState (BottomSheetBehavior.STATE_COLLAPSED);

Când faceți clic pe butonul din mijloc, ajungeți la o foaie inferioară în modul de căutare care poate fi extinsă la înălțimea completă prin tragerea acesteia.

Este posibil să observați că atunci când încercați să trageți foaia inferioară în jos, aceasta se prăbușește numai până la mărimea peek. Puteți rezolva acest lucru adăugând a BottomSheetCallback la BottomSheetBehavior, setând dimensiunea pensiunii la zero când utilizatorul prăbușește foaia. În aplicația de exemplu, aceasta se adaugă la sfârșitul secțiunii onCreate ().

mBottomSheetBehavior.setBottomSheetCallback (nou BottomSheetBehavior.ButtomSheetCallback () @Override public void onStateChanged (Vizualizare bottomSheet, int newState) if (newState == BottomSheetBehavior.STATE_COLLAPSED) mBottomSheetBehavior.setPeekHeight (0); @Override public void onSlide bottomSheet, float slideOffset) );

4. Folosind un fragment de foaie inferioară

După cum am menționat mai devreme în acest articol, puteți afișa și a BottomSheetDialogFragment în locul a Vedere în foaia inferioară. Pentru a face acest lucru, mai întâi trebuie să creați o clasă nouă care să se extindă BottomSheetDialogFragment.

În cadrul setupDialog () , puteți să umflați un nou fișier de aspect și să îl recuperați BottomSheetBehavior din vizualizarea containerelor din Activitate. După ce ai comportamentul, poți să creezi și să asociezi a BottomSheetCallback cu aceasta pentru a respinge Fragment când foaia este ascunsă.

public class TutsPlusBottomSheetDialogFragment se extinde BottomSheetDialogFragment privat BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback () @ Suprascriere public void onStateChanged (@NonNull View bottomSheet, int newState) if (newState == BottomSheetBehavior.STATE_HIDDEN) respingerea ();  @Overide publice void onSlide (@NonNull View bottomSheet, float slideOffset) ; @Override public void setupDialog (Dialog dialog, stil int) super.setupDialog (dialog, stil); Vizualizați contentView = View.inflate (getContext (), R.layout.fragment_bottom_sheet, null); dialog.setContentView (contentView); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) (Vizualizare) contentView.getParent ()). GetLayoutParams (); CoordonatorLayout.Behavior comportament = params.getBehavior (); dacă (comportament! = null && comportament instanceof BottomSheetBehavior) ((BottomSheetBehavior) comportament) .setBottomSheetCallback (mBottomSheetBehaviorCallback); 

În cele din urmă, puteți apela spectacol() pe un exemplu al tău Fragment pentru ao afișa în foaia inferioară.

BottomSheetDialogFragment bottomSheetDialogFragment = nou TutsPlusBottomSheetDialogFragment (); bottomSheetDialogFragment.show (getSupportFragmentManager (), bottomSheetDialogFragment.getTag ());

Concluzie

Utilizarea bibliotecii de suport pentru proiectare pentru a afișa o foaie inferioară este atât versatilă, cât și simplă. Acestea pot fi utilizate pentru a afișa detalii sau pickers fără a obține în cale, precum și să acționeze ca un mare înlocuitor pentru DialogFragment în situația potrivită. Înțelegerea modului în care foaia inferioară poate fi utilizată în aplicația dvs. vă va oferi un instrument suplimentar pentru a crea aplicații grozave.

Cod