Não tenho mais tempo para manter isso. Basicamente, escrevi toda a biblioteca às pressas, sem testes, embora fosse um iniciante especialista sério na época. Como resultado, há muitas peças móveis imprevisíveis e os testes provavelmente também não são tão bons. Realmente não sei, já que não toco nisso há anos.
Eu recomendo que você use o BottomNavigationView oficial do Google e incentive-os a implementar os recursos necessários. Ou use outra biblioteca de terceiros.
A versão mais recente anterior pode ser encontrada na ramificação v1
Como contribuir
Registro de alterações
Um componente de visualização personalizado que imita o novo padrão de navegação inferior do Material Design.
Não. A versão do minSDK é API de nível 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 >
Você pode adicionar itens escrevendo um arquivo de recursos XML .
Os ícones devem ser totalmente opacos, de cor preta sólida, 24 dp e sem preenchimento . Por exemplo, com o gerador de ícones genéricos do Android Asset Studio, selecione "TRIM" e certifique-se de que o preenchimento seja 0dp. Esta é a aparência dos seus ícones:
Defina suas guias em um arquivo de recursos XML.
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 >
Em seguida, adicione o BottomBar ao seu layout e forneça a ele um ID de recurso para o arquivo xml das guias.
layout/atividade_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 >
Por padrão, as guias não fazem nada, a menos que você ouça os eventos de seleção e faça algo quando as guias são selecionadas.
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.
}
}
});
}
}
Se você quiser ouvir eventos de reseleção, veja como fazer isso:
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.
}
}
});
Se quiser cancelar condicionalmente a seleção de qualquer guia, você pode. Basta atribuir um TabSelectionInterceptor
ao BottomBar e retornar true do método shouldInterceptTabSelection()
.
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 ;
}
});
Se você quiser ter um ícone diferente quando uma guia específica for selecionada, basta usar drawables de lista de estados.
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! -->
...
Basta adicionar barColorWhenSelected
a cada guia. Quando essa guia é selecionada, toda a cor de fundo do BottomBar é alterada com uma bela animação.
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 >
Primeiro, defina um estilo que seja filho do tema principal do seu aplicativo:
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 >
Você também terá que criar uma versão stub do mesmo tema para evitar travamentos em níveis de API anteriores ao Lollipop:
res/valores/estilos.xml
< style name = " AppTheme.TransNav " parent = " AppTheme " />
Inclua também o mesmo stub em seu values-land-v21.xml
para evitar barra de navegação transparente e comportamento estranho na paisagem.
res/valores-land-v21.xml:
< style name = " AppTheme.TransNav " parent = " AppTheme " />
Aplique o tema em AndroidManifest.xml
para sua atividade.
AndroidManifest.xml:
< activity android : name = " .MyAwesomeActivity " android : theme = " @style/AppTheme.TransNav " />
Finalmente, defina bb_behavior
para incluir o sinalizador underNavbar
e pronto!
atividade_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 " />
Especifique um layout diferente para sua atividade na pasta res/layout-sw600dp
e defina bb_tabletMode
como 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 >
Fácil!
atividade_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>
Você pode facilmente adicionar emblemas para mostrar uma contagem de mensagens não lidas ou novos itens/o que quiser.
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/
shifting
: a guia selecionada é mais larga que as demais. shy
: coloque o BottomBar dentro de um CoordinatorLayout e ele será ocultado automaticamente na rolagem! underNavbar
: desenhe o BottomBar sob o navBar!fonts/MySuperDuperFont.ttf
. Nesse caso, o caminho da fonte seria semelhante a src/main/assets/fonts/MySuperDuperFont.ttf
, mas você só precisa fornecer fonts/MySuperDuperFont.ttf
, pois a pasta de ativos será preenchida automaticamente para você.< tab
id = " @+id/tab_recents "
title = " Recents "
icon = " @drawable/empty_icon "
inActiveColor = " #00FF00 "
activeColor = " #FF0000 "
barColorWhenSelected = " #FF0000 "
badgeBackgroundColor = " #FF0000 "
badgeHidesWhenActive = " true " />
Envie-me uma solicitação pull com README.md modificado para receber uma mensagem!
Sinta-se à vontade para criar problemas e receber solicitações.
Ao criar solicitações pull, mais é mais: eu gostaria de ver dez pequenas solicitações pull separadas por recurso, em vez de todas elas combinadas em uma enorme.
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.