У меня больше нет времени поддерживать это. По сути, я написал всю библиотеку в спешке, без тестов, будучи на тот момент серьезным новичком-экспертом. В результате здесь много непредсказуемых движущихся частей, и тесты, вероятно, тоже не такие уж хорошие. Не знаю, так как я не прикасался к этому уже много лет.
Я бы порекомендовал вам использовать официальный BottomNavigationView от Google и призвать их реализовать необходимые вам функции. Или используйте другую стороннюю библиотеку.
Последнюю версию до этого можно найти в ветке v1
Как внести свой вклад
Журнал изменений
Пользовательский компонент представления, имитирующий новый шаблон нижней навигации Material Design.
Неа. Версия minSDK — это уровень API 11 (Honeycomb).
compile ' com.roughike:bottom-bar:2.3.1 '
Мавен:
< dependency >
< groupId >com.roughike</ groupId >
< artifactId >bottom-bar</ artifactId >
< version >2.3.1</ version >
< type >pom</ type >
</ dependency >
Вы можете добавлять элементы, записывая файл ресурсов XML .
Значки должны быть полностью непрозрачными, сплошного черного цвета, с разрешением 24 dp и без полей . Например, с помощью генератора универсальных значков Android Asset Studio выберите «TRIM» и убедитесь, что заполнение равно 0dp. Вот как должны выглядеть ваши значки:
Определите свои вкладки в файле ресурсов 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 >
Затем добавьте BottomBar в свой макет и присвойте ему идентификатор ресурса для вашего XML-файла вкладок.
макет/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 >
По умолчанию вкладки ничего не делают, если вы не прослушиваете события выбора и не выполняете какие-либо действия, когда вкладки выбраны.
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.
}
}
});
}
}
Если вы хотите прослушивать события повторного выбора, вот как это сделать:
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.
}
}
});
Если вы хотите условно отменить выбор какой-либо вкладки, вы можете это сделать. Просто назначьте TabSelectionInterceptor
для BottomBar и верните true из метода 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 ;
}
});
Если вы хотите, чтобы при выборе определенной вкладки был другой значок, просто используйте чертежи списка состояний.
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! -->
...
Просто добавьте barColorWhenSelected
на каждую вкладку. Когда эта вкладка выбрана, весь цвет фона BottomBar изменяется с красивой анимацией.
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 >
Сначала определите стиль, который является дочерним по отношению к основной теме приложения:
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 >
Вам также придется создать заглушку той же темы , чтобы избежать сбоев на предыдущих уровнях API, чем Lollipop:
res/values/styles.xml
< style name = " AppTheme.TransNav " parent = " AppTheme " />
Также включите ту же заглушку в файл values-land-v21.xml
чтобы избежать прозрачной панели навигации и странного поведения в альбомной ориентации.
res/values-land-v21.xml:
< style name = " AppTheme.TransNav " parent = " AppTheme " />
Примените тему в AndroidManifest.xml
для своей деятельности.
AndroidManifest.xml:
< activity android : name = " .MyAwesomeActivity " android : theme = " @style/AppTheme.TransNav " />
Наконец, установите в bb_behavior
флаг underNavbar
, и все готово!
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 " />
Укажите другой макет для своей деятельности в папке res/layout-sw600dp
и установите для bb_tabletMode
значение 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 >
Легко-просто!
активность_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>
Вы можете легко добавить значки для отображения количества непрочитанных сообщений или новых элементов/всего, что вам нравится.
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
: выбранная вкладка шире остальных. shy
: поместите BottomBar внутрь координатораLayout, и он автоматически скроется при прокрутке! underNavbar
: нарисуйте BottomBar под навигационной панелью!fonts/MySuperDuperFont.ttf
. В этом случае ваш путь к шрифту будет выглядеть так: src/main/assets/fonts/MySuperDuperFont.ttf
, но вам нужно указать только fonts/MySuperDuperFont.ttf
, поскольку папка ресурсов будет автоматически заполнена.< tab
id = " @+id/tab_recents "
title = " Recents "
icon = " @drawable/empty_icon "
inActiveColor = " #00FF00 "
activeColor = " #FF0000 "
barColorWhenSelected = " #FF0000 "
badgeBackgroundColor = " #FF0000 "
badgeHidesWhenActive = " true " />
Отправьте мне запрос на включение с измененным файлом README.md, чтобы получить поддержку!
Не стесняйтесь создавать задачи и запросы на извлечение.
При создании запросов на включение больше значит больше: я бы хотел видеть десять небольших запросов на включение, разделенных по функциям, а не все они объединены в один огромный.
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.