Ich habe keine Zeit mehr, das aufrechtzuerhalten. Ich habe die gesamte Bibliothek im Grunde genommen in Eile und ohne Tests geschrieben, obwohl ich damals ein ernsthafter Anfänger war. Infolgedessen gibt es viele unvorhersehbare bewegliche Teile und die Tests sind wahrscheinlich auch nicht so toll. Ich weiß es nicht genau, da ich das schon seit Ewigkeiten nicht mehr angerührt habe.
Ich würde Ihnen empfehlen, das offizielle BottomNavigationView von Google zu verwenden und sie dringend zu bitten, die von Ihnen benötigten Funktionen zu implementieren. Oder verwenden Sie eine andere Bibliothek eines Drittanbieters.
Die aktuellste Version davor finden Sie im v1-Zweig
So können Sie einen Beitrag leisten
Änderungsprotokoll
Eine benutzerdefinierte Ansichtskomponente, die das neue Material Design Bottom Navigation-Muster nachahmt.
Nein. Die minSDK-Version ist API-Level 11 (Honeycomb).
compile ' com.roughike:bottom-bar:2.3.1 '
Maven:
< dependency >
< groupId >com.roughike</ groupId >
< artifactId >bottom-bar</ artifactId >
< version >2.3.1</ version >
< type >pom</ type >
</ dependency >
Sie können Elemente hinzufügen, indem Sie eine XML-Ressourcendatei schreiben .
Die Symbole müssen vollständig undurchsichtig, einfarbig schwarz, 24 dp und ohne Polsterung sein. Wählen Sie beispielsweise mit dem Generic-Icon-Generator von Android Asset Studio „TRIM“ und stellen Sie sicher, dass der Abstand 0 dp beträgt. So sollten Ihre Symbole aussehen:
Definieren Sie Ihre Registerkarten in einer XML-Ressourcendatei.
res/xml/bottombar_tabs.xml:
< tabs >
< tab
id = " @+id/tab_favorites "
icon = " @drawable/ic_favorites "
title = " Favorites " />
< tab
id = " @+id/tab_nearby "
icon = " @drawable/ic_nearby "
title = " Nearby " />
< tab
id = " @+id/tab_friends "
icon = " @drawable/ic_friends "
title = " Friends " />
</ tabs >
Fügen Sie dann die BottomBar zu Ihrem Layout hinzu und geben Sie ihr eine Ressourcen-ID für Ihre Tabs-XML-Datei.
layout/activity_main.xml
< RelativeLayout xmlns : android = " http://schemas.android.com/apk/res/android "
android : layout_width = " match_parent "
android : layout_height = " match_parent "
xmlns : app = " http://schemas.android.com/apk/res-auto " >
<!-- This could be your fragment container, or something -->
< FrameLayout
android : id = " @+id/contentContainer "
android : layout_width = " match_parent "
android : layout_height = " match_parent "
android : layout_above = " @+id/bottomBar " />
< com .roughike.bottombar.BottomBar
android : id = " @+id/bottomBar "
android : layout_width = " match_parent "
android : layout_height = " 60dp "
android : layout_alignParentBottom = " true "
app : bb_tabXmlResource = " @xml/bottombar_tabs " />
</ RelativeLayout >
Standardmäßig führen die Registerkarten nichts aus, es sei denn, Sie warten auf Auswahlereignisse und unternehmen etwas, wenn die Registerkarten ausgewählt sind.
MainActivity.java:
public class MainActivity extends Activity {
@ Override
protected void onCreate ( @ Nullable Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
BottomBar bottomBar = ( BottomBar ) findViewById ( R . id . bottomBar );
bottomBar . setOnTabSelectListener ( new OnTabSelectListener () {
@ Override
public void onTabSelected ( @ IdRes int tabId ) {
if ( tabId == R . id . tab_favorites ) {
// The tab with id R.id.tab_favorites was selected,
// change your content accordingly.
}
}
});
}
}
Wenn Sie auf Wiederauswahlereignisse warten möchten, gehen Sie wie folgt vor:
bottomBar . setOnTabReselectListener ( new OnTabReselectListener () {
@ Override
public void onTabReSelected ( @ IdRes int tabId ) {
if ( tabId == R . id . tab_favorites ) {
// The tab with id R.id.tab_favorites was reselected,
// change your content accordingly.
}
}
});
Wenn Sie die Auswahl einer Registerkarte bedingt abbrechen möchten, ist dies durchaus möglich. Weisen Sie der BottomBar einfach einen TabSelectionInterceptor
zu und geben Sie true von der Methode shouldInterceptTabSelection()
zurück.
bottomBar . setTabSelectionInterceptor ( new TabSelectionInterceptor () {
@ Override
public boolean shouldInterceptTabSelection ( @ IdRes int oldTabId , @ IdRes int newTabId ) {
if ( newTabId == R . id . tab_pro_feature && ! userHasProVersion ()) {
startProVersionPurchaseFlow ();
return true ;
}
return false ;
}
});
Wenn Sie bei der Auswahl einer bestimmten Registerkarte ein anderes Symbol haben möchten, verwenden Sie einfach die Statuslisten-Drawables.
res/drawable/my_tab_icon.xml
< selector xmlns : android = " http://schemas.android.com/apk/res/android " >
< item android : drawable = " @drawable/ic_myicon_selected " android : state_selected = " true " />
< item android : drawable = " @drawable/ic_myicon_default " android : state_selected = " false " />
</ selector >
res/xml/bottombar_tabs.xml
...
< tab
id = " @+id/tab_favorites "
icon = " @drawable/my_tab_icon "
title = " Favorites " />
<!-- You can use @color resources too! -->
...
Fügen Sie einfach barColorWhenSelected
zu jeder Registerkarte hinzu. Wenn diese Registerkarte ausgewählt wird, wird die gesamte Hintergrundfarbe der BottomBar mit einer schönen Animation geändert.
res/xml/bottombar_tabs.xml
< tabs >
< tab
id = " @+id/tab_favorites "
icon = " @drawable/ic_favorites "
title = " Favorites "
barColorWhenSelected = " #5D4037 " />
<!-- You can use @color resources too! -->
</ tabs >
Definieren Sie zunächst einen Stil, der Ihrem Hauptanwendungsthema untergeordnet ist:
res/values-v21/styles.xml
< style name = " AppTheme.TransNav " parent = " AppTheme " >
< item name = " android:navigationBarColor " >@android:color/transparent</ item >
< item name = " android:windowTranslucentNavigation " >true</ item >
< item name = " android:windowDrawsSystemBarBackgrounds " >true</ item >
</ style >
Sie müssen außerdem eine Stub-Version desselben Themas erstellen, um Abstürze in früheren API-Ebenen als Lollipop zu vermeiden:
res/values/styles.xml
< style name = " AppTheme.TransNav " parent = " AppTheme " />
Fügen Sie den gleichen Stub auch in Ihre values-land-v21.xml
ein, um eine transparente Navigationsleiste und seltsames Verhalten im Querformat zu vermeiden.
res/values-land-v21.xml:
< style name = " AppTheme.TransNav " parent = " AppTheme " />
Wenden Sie das Design in AndroidManifest.xml
für Ihre Aktivität an.
AndroidManifest.xml:
< activity android : name = " .MyAwesomeActivity " android : theme = " @style/AppTheme.TransNav " />
Stellen Sie schließlich bb_behavior
so ein, dass es das Flag underNavbar
“ enthält, und schon kann es losgehen!
activity_my_awesome.xml:
< com .roughike.bottombar.BottomBar
android : id = " @+id/bottomBar "
android : layout_width = " match_parent "
android : layout_height = " 56dp "
android : layout_alignParentBottom = " true "
app : bb_tabXmlResource = " @xml/my_awesome_bottombar_tabs "
app : bb_behavior = " underNavbar " />
Geben Sie im Ordner res/layout-sw600dp
ein anderes Layout für Ihre Aktivität an und setzen Sie bb_tabletMode
auf true.
res/layout-sw600dp/activity_main.xml:
< RelativeLayout
xmlns : android = " http://schemas.android.com/apk/res/android "
xmlns : app = " http://schemas.android.com/apk/res-auto "
android : layout_width = " match_parent "
android : layout_height = " match_parent " >
< com .roughike.bottombar.BottomBar
android : id = " @+id/bottomBar "
android : layout_width = " wrap_content "
android : layout_height = " match_parent "
android : layout_alignParentLeft = " true "
app : bb_tabXmlResource = " @xml/bottombar_tabs_three "
app : bb_tabletMode = " true " />
<!-- This could be your fragment container, or something -->
< FrameLayout
android : id = " @+id/contentContainer "
android : layout_width = " match_parent "
android : layout_height = " match_parent "
android : layout_toRightOf = " @+id/bottomBar " />
</ RelativeLayout >
Kinderleicht!
Aktivität_main.xml:
< android .support.design.widget.CoordinatorLayout xmlns : android = " http://schemas.android.com/apk/res/android "
xmlns : app = " http://schemas.android.com/apk/res-auto "
android : layout_width = " match_parent "
android : layout_height = " match_parent " >
< android .support.v4.widget.NestedScrollView
android : id = " @+id/myScrollingContent "
android : layout_width = " match_parent "
android : layout_height = " match_parent " >
<!-- Your loooooong scrolling content here. -->
</ android .support.v4.widget.NestedScrollView>
< com .roughike.bottombar.BottomBar
android : id = " @+id/bottomBar "
android : layout_width = " match_parent "
android : layout_height = " 60dp "
android : layout_gravity = " bottom "
app : bb_tabXmlResource = " @xml/bottombar_tabs_three "
app : bb_behavior = " shy " />
</ android .support.design.widget.CoordinatorLayout>
Sie können ganz einfach Abzeichen hinzufügen, um die Anzahl ungelesener Nachrichten oder neue Elemente anzuzeigen bzw. was auch immer Sie möchten.
BottomBarTab nearby = bottomBar . getTabWithId ( R . id . tab_nearby );
nearby . setBadgeCount ( 5 );
// Remove the badge when you're done with it.
nearby . removeBadge /();
< com .roughike.bottombar.BottomBar
android : id = " @+id/bottomBar "
android : layout_width = " match_parent "
android : layout_height = " 60dp "
android : layout_alignParentBottom = " true "
app : bb_tabXmlResource = " @xml/bottombar_tabs_three "
app : bb_tabletMode = " true "
app : bb_behavior = " shifting|shy|underNavbar "
app : bb_inActiveTabAlpha = " 0.6 "
app : bb_activeTabAlpha = " 1 "
app : bb_inActiveTabColor = " #222222 "
app : bb_activeTabColor = " @color/colorPrimary "
app : bb_badgesHideWhenActive = " true "
app : bb_titleTextAppearance = " @style/MyTextAppearance "
app : bb_titleTypeFace = " fonts/MySuperDuperFont.ttf "
app : bb_showShadow = " true " />
values/xml/
befinden.shifting
: Die ausgewählte Registerkarte ist breiter als die anderen. shy
: Fügen Sie die BottomBar in ein CoordinatorLayout ein und sie wird beim Scrollen automatisch ausgeblendet! underNavbar
: Zeichnen Sie die BottomBar unter die NavBar!fonts/MySuperDuperFont.ttf
. In diesem Fall würde Ihr Schriftartenpfad wie folgt aussehen: src/main/assets/fonts/MySuperDuperFont.ttf
, Sie müssen jedoch nur fonts/MySuperDuperFont.ttf
angeben, da der Asset-Ordner automatisch für Sie ausgefüllt wird.< tab
id = " @+id/tab_recents "
title = " Recents "
icon = " @drawable/empty_icon "
inActiveColor = " #00FF00 "
activeColor = " #FF0000 "
barColorWhenSelected = " #FF0000 "
badgeBackgroundColor = " #FF0000 "
badgeHidesWhenActive = " true " />
Schicken Sie mir eine Pull-Anfrage mit geänderter README.md, um einen Shoutout zu erhalten!
Fühlen Sie sich frei, Issues und Pull-Requests zu erstellen.
Beim Erstellen von Pull-Requests gilt: Mehr ist mehr: Ich würde gerne zehn kleine Pull-Requests sehen, die nach Funktionen getrennt sind, anstatt alle zu einem großen Pull-Request zusammenzufassen.
BottomBar library for Android
Copyright (c) 2016 Iiro Krankka (http://github.com/roughike).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.