Android
BottomNavigationView
Sök…
Introduktion
Den nedre navigeringsvyn har funnits i riktlinjerna för materialdesign under en längre tid, men det har inte varit lätt för oss att implementera det i våra appar.
Vissa applikationer har byggt sina egna lösningar, medan andra har förlitat sig på open source-bibliotek från tredje part för att få jobbet gjort.
Nu ser designstödbiblioteket tillägget av den här nedre navigeringsfältet, låt oss ta ett dyk i hur vi kan använda det!
Anmärkningar
Representerar en standard nedre navigeringsfält för applikation. Det är en implementering av materialdesignens bottennavigering.
länkar:
Grundläggande implementering
BottomNavigationView
här lägger du till BottomNavigationView
:
- Lägg till din
build.gradle
beroende :
compile 'com.android.support:design:25.1.0'
- Lägg till
BottomNavigationView
i din layout :
<android.support.design.widget.BottomNavigationView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_navigation_menu"/>
- Skapa menyn för att fylla vyn:
<!-- res/menu/bottom_navigation_menu.xml -->
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/my_action1"
android:enabled="true"
android:icon="@drawable/my_drawable"
android:title="@string/text"
app:showAsAction="ifRoom" />
....
</menu>
- Bifoga en lyssnare för klickhändelserna:
//Get the view
BottomNavigationView bottomNavigationView = (BottomNavigationView)
findViewById(R.id.bottom_navigation);
//Attach the listener
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.my_action1:
//Do something...
break;
//...
}
return true;//returning false disables the Navigation bar animations
}
});
Kassademokod vid BottomNavigation-Demo
Anpassning av BottomNavigationView
Obs! Jag antar att du vet om hur du använder BottomNavigationView
.
I det här exemplet kommer jag att förklara hur man lägger till väljare för BottomNavigationView
. Så du kan ange i UI för ikoner och texter.
Skapa dragbar bottom_navigation_view_selector.xml
som
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/bottom_nv_menu_selected" android:state_checked="true" />
<item android:color="@color/bottom_nv_menu_default" />
</selector>
Och använd attribut nedan i BottomNavigationView
i BottomNavigationView
app:itemIconTint="@drawable/bottom_navigation_view_selector"
app:itemTextColor="@drawable/bottom_navigation_view_selector"
I exemplet ovan har jag använt samma väljare
bottom_navigation_view_selector
förapp:itemIconTint
ochapp:itemTextColor
både för att hålla text- och ikonfärger desamma. Men om din design har olika färger för text och ikon, kan du definiera två olika väljare och använda dem.
Output kommer att likna nedan
Hantera aktiverade / inaktiverade tillstånd
Skapa väljare för Aktivera / inaktivera menyalternativ.
selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/white" android:state_enabled="true" />
<item android:color="@color/colorPrimaryDark" android:state_enabled="false" />
</selector>
design.xml
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@drawable/nav_item_color_state"
app:itemTextColor="@drawable/nav_item_color_state"
app:menu="@menu/bottom_navigation_main" />
Tillåter mer än 3 menyer
Detta exempel är strikt en lösning eftersom det för närvarande inte finns något sätt att inaktivera ett beteende som kallas ShiftMode.
Skapa en funktion som sådan.
public static void disableMenuShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShiftingMode(false);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Log.e("BNVHelper", "Unable to get shift mode field", e);
} catch (IllegalAccessException e) {
Log.e("BNVHelper", "Unable to change value of shift mode", e);
}
}
Detta inaktiverar skiftbeteendet på menyn när objektantalet överstiger 3 nos.
ANVÄNDANDE
BottomNavigationView navView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
disableMenuShiftMode(navView);
Proguard-problem : Lägg till följande rad proguard-konfigurationsfil så annars fungerar det inte.
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
Alternativt kan du skapa en klass och komma åt den här metoden därifrån. Se originalsvar här
OBS : Detta är en reflektionsbaserad HOTFIX , uppdatera detta när Googles supportbibliotek har uppdaterats med ett direktfunktionssamtal.