Android Support Desing Library 25を使用してBottomNavigationViewを使用しています。しかし、タブを切り替えると、他のタブのタイトルが非表示になります。しかし、実際のボトムナビゲーションビューに隠れている問題はありません。しかし、私のものは隠れています。
しかし、私はそのように見えたいです。それを行うためのアイデアはありますか?私は何が欠けていますか?
ここに私のコードがあります:
activity_main.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="com.example.yunus.ototakip.MainActivity">
<FrameLayout
Android:id="@+id/main_container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_above="@+id/bottom_navigation"
Android:layout_alignParentTop="true">
</FrameLayout>
<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="@color/beyaz"
app:itemTextColor="@color/beyaz"
app:menu="@menu/bottombar_menu" />
bottom_bar_menu.xml
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/bb_menu_arac"
Android:enabled="true"
Android:icon="@drawable/icon_car"
Android:title="@string/araclarim"
app:showAsAction="ifRoom" />
<item
Android:id="@+id/bb_menu_yakin"
Android:enabled="true"
Android:icon="@drawable/icon_yer"
Android:title="@string/yakinimdakiler"
app:showAsAction="ifRoom" />
<item
Android:id="@+id/bb_menu_yaklasan"
Android:enabled="true"
Android:icon="@drawable/icon_takvim"
Android:title="@string/yaklasanlar"
app:showAsAction="ifRoom" />
<item
Android:id="@+id/bb_menu_ipucu"
Android:enabled="true"
Android:icon="@drawable/icon_ipucu"
Android:title="@string/ipuclari"
app:showAsAction="ifRoom" />
</menu>
MShiftingModeフィールドが削除されたため、リフレクションを使用したソリューションは機能しなくなりました。
これを行う簡単な方法があります。サポートライブラリ28を使用して、BottomNavigationView
XML宣言にapp:labelVisibilityMode="labeled"
を追加するだけです。
それが役に立てば幸い。
UPDATE
removeShiftMode()は不要になりました。サポートライブラリ28.0.0-alpha1で Labels を追加できるようになったためです。
XMLの場合:
<Android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
プログラムで変更する場合:
mBottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
これが機能するには、設計サポートライブラリを28.0.0-alpha1に更新します
ここに良い 読み取り
古いサポートライブラリの場合:
bottom_bar_menu.xml
でshowAsAction
属性を変更します
<item Android:id="@id/menu_item"
Android:title="text"
Android:icon="@drawable/drawable_resource_name"
Android:showAsAction="always|withText" />
build.gradleで:
compile 'com.Android.support:design:25.3.1'
ボトムナビゲーションビュー3項目以上:removeShiftMode()
メソッドを使用
BottomNavigationViewHelper.Java
で使用:
import Android.annotation.SuppressLint;
import Android.support.design.internal.BottomNavigationItemView;
import Android.support.design.internal.BottomNavigationMenuView;
import Android.support.design.widget.BottomNavigationView;
import Java.lang.reflect.Field;
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void removeShiftMode(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("BottomNav", "Unable to get shift mode field", e);
} catch (IllegalAccessException e) {
Log.e("BottomNav", "Unable to change value of shift mode", e);
}
}
}
次を使用して呼び出します。
BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
タイトルテキストのシフトアニメーションを無効にし、テキストを表示できるようにします。
BottomNavigationViewのソースコードをスキャンすると、
mShiftingMode = mMenu.size() > 3;
BottomNavigationMenuView.Java行265では、メニューサイズが3を超える間、タブタイトルは非表示になります。したがって、タブのタイトルを表示したい場合は、ビルドからコードを取得して以下に変更するだけです。
mShiftingMode = mMenu.size() > 5;
PS:BottonNavigationViewの最大タブカウントは3〜5でなければなりません。 BottomNavigationViewNew
クラスBottomNavigationViewHelperを作成する
import Android.annotation.SuppressLint;
import Android.support.design.internal.BottomNavigationItemView;
import Android.support.design.internal.BottomNavigationMenuView;
import Android.support.design.widget.BottomNavigationView;
import Android.util.Log;
import Java.lang.reflect.Field;
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void disableShiftMode(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);
if(menuView.getChildCount()<6)
{
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);
}
}
}
コール
BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
Kotlin拡張機能:
@SuppressLint("RestrictedApi")
fun BottomNavigationView.removeShiftMode(){
val menuView = this.getChildAt(0) as BottomNavigationMenuView
try {
val shiftingMode = menuView.javaClass.getDeclaredField("mShiftingMode")
shiftingMode.isAccessible = true
shiftingMode.setBoolean(menuView, false)
shiftingMode.isAccessible = false
for (i in 0 until menuView.childCount) {
val item = menuView.getChildAt(i) as BottomNavigationItemView
item.setShiftingMode(false)
// set once again checked value, so view will be updated
item.setChecked(item.itemData.isChecked)
}
} catch (e: NoSuchFieldException) {
e.printStackTrace()
Timber.tag("BottomNav").e( e, "Unable to get shift mode field")
} catch (e: IllegalAccessException) {
Timber.tag("BottomNav").e( e, "Unable to change value of shift mode")
}
}
Rafsanahmad007 answer を使用しましたが、Kotlinに変換します。将来の放浪者のためにそれを共有させてください
@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
val menuView = this.getChildAt(0) as BottomNavigationMenuView
try {
val shiftingMode = menuView::class.Java.getDeclaredField("mShiftingMode")
shiftingMode.setAccessible(true)
shiftingMode.setBoolean(menuView, false)
shiftingMode.setAccessible(false)
for (i in 0..(menuView.childCount - 1)) {
val item = menuView.getChildAt(i) as BottomNavigationItemView
item.setShiftingMode(false)
// set once again checked value, so view will be updated
item.setChecked(item.getItemData().isChecked())
}
} catch (e: NoSuchFieldException) {
Timber.e("Unable to get shift mode field")
} catch (e: IllegalAccessException) {
Timber.e("Unable to change value of shift mode")
}
}
これはAPI 26で私のために働いています:
navigation = (BottomNavigationView) view.findViewById(R.id.bottom_navigation);
try{disableShiftMode(navigation);}catch(Exception ew){}
呼び出すアクティビティまたはフラグメントでこのメソッドを作成します。
@SuppressLint("RestrictedApi")
public static void disableShiftMode(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);
item.setShiftingMode(false);
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
} catch (IllegalAccessException e) {
}
}
xmlにapp:labelVisibilityMode = "labeled"を追加するだけで簡単に修正
<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/bottom_navigation_color_selector"
app:itemTextColor="@drawable/bottom_navigation_color_selector"
app:labelVisibilityMode="labeled"
app:menu="@menu/menu_bottom_navigation" />
注
implementation 'com.Android.support:appcompat-v7:28.0.0'
implementation 'com.Android.support:design:28.0.0'
implementation 'com.Android.support:support-v4:28.0.0'