デザインサポートライブラリバージョン25のAndroid.support.design.widget.BottomNavigationViewを使用しています
compile 'com.Android.support:design:25.0.0'
<Android.support.design.widget.BottomNavigationView
Android:id="@+id/bottomBar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_gravity="center"
app:itemBackground="@color/colorPrimary"
app:menu="@menu/bottom_navigation_main"
Android:forceHasOverlappingRendering="true"/>
@ menu/bottom_navigation_mainに3つのアクションしかない場合、アイコンとテキストラベルの両方が常に表示されます。
3つ以上のアクションがあるときに常にアイコンとテキストラベルの両方を表示する方法は何ですか。
まだソリューションを探していて、サードパーティのライブラリやランタイムリフレクションに依存したくない場合、Support Library 28/JetpackのBottomNavigationViewは常にテキストラベルを常にサポートしています。
これ は、探しているメソッドです。
または、XMLでapp:labelVisibilityMode="labeled"
2018年5月8日から更新
app:labelVisibilityMode="labeled"
で<Android.support.design.widget.BottomNavigationView />
を直接使用できます
長いソリューションの下でこれを必要としないでください。
前の回答
BottomNavigationViewで奇妙な動作をしました。その中のアイテム/フラグメントを選択していたとき、フラグメントはBottomNavigationViewを少し下に押すので、BottomNavigationViewのテキストは画面の下に移動します。
その奇妙な動作に直面している場合、ここに解決策があります。削除するだけ
Android:fitsSystemWindows="true"
フラグメントのルートレイアウト内。これを取り除いてブームになるだけです! BottomNavigationViewは正常に機能しますが、テキストとアイコンで表示できるようになりました。これはフラグメントのルートCoordinatorLayoutにありました。
また、追加することを忘れないでください
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
アクティビティでシフトモードを無効にします。
そのクラスは次のとおりです。
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void removeShiftMode(BottomNavigationView view) {
//this will remove shift mode for bottom navigation 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);
// set once again checked value, so view will be updated
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field");
} catch (IllegalAccessException e) {
Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode");
}
}
}
バージョン25では困難です。
このコードを試してください。しかし、私はそれは良い解決策ではないと思います。
BottomNavigationView navigationView = (BottomNavigationView) findViewById(R.id.bottomBar);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
itemView.setShiftingMode(false);
itemView.setChecked(false);
}
@STAR_ZEROと@ KishanSolanki124のソリューションを組み合わせたKotlin拡張関数は次のとおりです。
fun BottomNavigationView.disableShiftMode() {
val menuView = getChildAt(0) as BottomNavigationMenuView
menuView.javaClass.getDeclaredField("mShiftingMode").apply {
isAccessible = true
setBoolean(menuView, false)
isAccessible = false
}
@SuppressLint("RestrictedApi")
for (i in 0 until menuView.childCount) {
(menuView.getChildAt(i) as BottomNavigationItemView).apply {
setShiftingMode(false)
setChecked(false)
}
}
}
使用するには:
myBottomNavigation.disableShiftMode()
この効果が必要ですか?
もしそうなら、 BottomNavigationViewEx 。
bottomNavigationViewクラスには、BottomNavigationMenuViewフィールドがあり、BottomNavigationMenuViewには、BottomNavigationItemView []フィールドがあります。これは、ボトムバーのアイテムです。
Nがアイテムの数だとすると、BottomNavigationMenuViewは、BottomNavigationItemView []配列の各メンバーでBottomNavigationItemView.setShiftingMode(n> 3)を呼び出します。この関数は動作を決定します(タイトルを常に表示するか、選択時にのみ表示します)。
したがって、常にタイトルを表示する方法は、このメソッドを呼び出すことです。リフレクションを使用してプライベートフィールドにアクセスできます。
BottomNavigationView bottomNavigationView= (BottomNavigationView) findViewById(R.id.bottom_navigation);
// get the private BottomNavigationMenuView field
Field f = null;
try {
f = bottomNavigationView.getClass().getDeclaredField("mMenuView");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
f.setAccessible(true);
BottomNavigationMenuView menuView=null;
try {
menuView = (BottomNavigationMenuView) f.get(bottomNavigationView);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// get the private BottomNavigationItemView[] field
try {
f=menuView.getClass().getDeclaredField("mButtons");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
f.setAccessible(true);
BottomNavigationItemView[] mButtons=null;
try {
mButtons = (BottomNavigationItemView[]) f.get(menuView);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
for(int i=0;i<mButtons.length;i++){
mButtons[i].setShiftingMode(false);
mButtons[i].setChecked(true);
}
タイトルをすべて表示する。このKotlinコードを試してください:
@SuppressLint("RestrictedApi")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_ofree)
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
val menuView = navigation.getChildAt(0) as BottomNavigationMenuView
for (i in 0 until menuView.childCount) {
val itemView = menuView.getChildAt(i) as BottomNavigationItemView
itemView.setShiftingMode(false)
itemView.setChecked(false)
}
}
BottomNavigationViewExの代替: BottomBar
これを試して、私のために働いた
app:labelVisibilityMode="labeled"
BottomNevigationViewでテキストとアイコンの両方を表示するためにこれを使用できます
app:labelVisibilityMode="labeled"
これを使用している場合、アイコンとテキストの両方を表示できます
<Android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/bottom_navigation_view"
Android:layout_alignParentBottom="true"
app:menu="@menu/bottom_navigation_menu"/>