BottomNavigationViewは、非アクティブなメニューのタイトルを表示しません。
すべてのメニュー要素のタイトルをbottomNavigationBarに表示する方法は?問題は、私の場合、クリックされた要素のタイトルのみを表示することです。
BottomNavigationViewは、非アクティブなメニューのタイトルを表示しません。
すべてのメニュー要素のタイトルをbottomNavigationBarに表示する方法は?問題は、私の場合、クリックされた要素のタイトルのみを表示することです。
回答:
の実装にBottomNavigationView
は条件があります。3つ以上のアイテムがある場合は、シフトモードを使用します。
現時点では、既存のAPIで変更することはできません。シフトモードを無効にする唯一の方法は、リフレクションを使用することです。
ヘルパークラスが必要です:
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 {
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);
//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);
}
}
}
次に、にdisableShiftMode
メソッドを適用しますがBottomNavigationView
、コードからメニュービューをインフレートする場合は、インフレート後に実行する必要があることに注意してください。
使用例:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
PS。
でメニュー項目を変更するたびに、このメソッドを実行する必要があることに注意してくださいBottomNavigationView
。
更新
また、proguard構成ファイル(例:proguard-rules.pro)を更新する必要があります。上記のコードはリフレクションを使用しており、proguardがmShiftingMode
フィールドを難読化すると機能しません。
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
指してくれてありがとうムハンマドAlfaifi この問題をとスニペットを提供します。
アップデート2
Jolanda Verhoefが指摘したように、新しいサポートライブラリ(28.0.0-alpha1
)および新しいMaterial Componentsライブラリ(1.0.0-beta01
)は、3つのメニュー項目でシフトモードを操作するために使用できるパブリックプロパティを提供します。
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
Material Componentsライブラリでは、5つのメニュー項目がある場合にも適用されます。
アップデート3
@ThomasSunderlandも指摘したように、このプロパティを後置記号app:itemHorizontalTranslation="false"
なしでfalseに設定すると、Enabled
アニメーションのシフトを無効にできます。
サポートライブラリ28.0.0-alpha1以降:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
app:
いないことを確認してくださいandroid:
テキストアニメーションを無効にするには、dimens.xmlファイルでこれを使用することもできます。
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
これをマニフェストに追加する必要があるかもしれません:
tools:override="true"
tools:override="true"
<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
で使用できるようになりapp:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
ました28-alpha
labeled
すべてのラベルを表示したままにします。unlabeled
アイコンのみを表示します。selected
選択したアイテムとシフトアイテムのラベルのみを表示します。auto
あなたが持っているアイテムの数に基づいてラベル付きまたは選択を選択します。1〜3のアイテムにラベルが付けられ、3以上のアイテムに選択されています。拡張関数としてのKotlinでのPrzemysławの回答
@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
val menuView = getChildAt(0) as BottomNavigationMenuView
try {
val shiftingMode = menuView::class.java.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) {
Log.e(TAG, "Unable to get shift mode field", e)
} catch (e: IllegalStateException) {
Log.e(TAG, "Unable to change value of shift mode", e)
}
}
使用法(Kotlin Android拡張機能を使用):
bottom_navigation_view.disableShiftMode()
私のために働く
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
または
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
テキストアニメーションを無効にしてフォントサイズを小さくするには、dimens.xmlファイルでこれを使用します。
<dimen name="design_bottom_navigation_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
Navigate
- > File...
> design_bottom_navigation_item.xml
他に方法がないことを確認します。
更新
AndroidのSDKバージョン28以上に彼らが変更されているitem.setShiftingMode(false)
にitem.setShifting(false)
また、彼らはフィールドを削除しました mShiftingMode
したがって、使用法は
BottomNavigationHelper.removeShiftMode(bottomNav);
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
private static final class BottomNavigationHelper {
@SuppressLint("RestrictedApi")
static void removeShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShifting(false);
item.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
}
}
他の人が指摘したように、サポートライブラリ28.0.0-alpha1以降、次のことが可能です。
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
または、プログラムで設定できます。
注:古いバージョンのサポートライブラリからアップグレードする場合は、コンパイルSDKのバージョンを上げることを忘れないでください。サポートlibrarayのバージョンをここで確認してください:サポートライブラリのバージョン
ただし、アプリが古いバージョンのデザインサポートライブラリに依存している場合は、コンパイル時にlabelVisibilityMode not foundメッセージが表示される可能性があります。その場合は、少なくとも28.0.0-alpha1のデザインサポートライブラリのバージョンに依存する、指定された依存関係のバージョンにアップグレードしてみてください。それが不可能な場合は、依存関係を明示的に定義してください。
Gradleを使用する場合
build.gradleでデザインサポートの依存関係を明示的に追加するには:
実装 'com.android.support:design:28.0.0'
デフォルトを使用して回答を更新しました。最新の設計ライブラリに更新
実装「com.android.support:design:28.0.0」
BottomNavigationView xml属性に入れます
app:itemHorizontalTranslationEnabled="false"
プログラムとしても置くことができます
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
ここでソースを見つけることができますBottomNavigationView
これがお役に立てば幸いです。
app:labelVisibilityMode
ですか?
あなたのBottomNavigationView
追加にapp:labelVisibilityMode="unlabeled"
<android.support.design.widget.BottomNavigationView
app:menu="@menu/bn_menu"
android:layout_height="56dp"
android:layout_width="match_parent"
app:labelVisibilityMode="unlabeled">
</android.support.design.widget.BottomNavigationView>
次の結果になります
BottomNavigationViewで奇妙な動作がありました。その中のアイテム/フラグメントを選択していたとき、フラグメントはBottomNavigationViewを少し下にプッシュするため、BottomNavigationViewのテキストは画面の下に表示されるため、アイコンのみが表示され、アイテムをクリックするとテキストが非表示になります。
あなたがその奇妙な振る舞いに直面しているなら、ここが解決策です。削除するだけ
android:fitsSystemWindows="true"
フラグメントのルートレイアウト。これを外してブームだけ!BottomNavigationViewは正常に動作し、テキストとアイコンで表示できるようになりました。これはフラグメントのルートCoordinatorLayoutにありました。
また、追加することを忘れないでください
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
あなたの活動でシフトモードを無効にします。質問とは正確には関係ありませんが、それでも役に立ちます。
これは私が使用するサードパーティのライブラリであり、シフトモードの無効化、アイコンのみの表示、アイコンサイズの設定など、多くのカスタマイズオプションがあります 。BottomNavigationViewEx
迷惑な小さな上部マージンのアニメーションも削除したい場合は、さらに多くのリフレクションコードが必要です。アニメーションを削除する完全なソリューションは次のとおりです。
@SuppressLint("RestrictedApi")
private 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);
Field shiftAmount = item.getClass().getDeclaredField("mShiftAmount");
shiftAmount.setAccessible(true);
shiftAmount.setInt(item, 0);
shiftAmount.setAccessible(false);
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Timber.e(e, "Unable to get fields");
} catch (IllegalAccessException e) {
Timber.e(e, "Unable to change values");
}
}
そして、それを必ずプロガード設定ファイルに追加してください:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
このメソッドの上にそれを追加したいだけです。disableShiftMode以下のコードも追加してください。@SuppressLint( "RestrictedApi")
https://android.jlelse.eu/disable-shift-label-animation-from-bottom-navigation-android-b42a25dcbffc
1
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:itemHorizontalTranslationEnabled="false"/>
2
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"/>
3
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_active_text_size"
tools:override="true">12sp</dimen>
これを使用して、BottomNevigationViewで3〜5アイテムのテキストとアイコンの両方を表示し、シフトを停止できます。
app:labelVisibilityMode="labeled"
しかし、5つの項目についてBottmNevigationViewで長いテキストがカットされる問題に直面します。そのため、BottomNevigationViewのアイコンだけでなく、テキストのシフトを停止するための良い解決策を見つけました。また、BottomNevigationViewのアイコンだけでなく、テキストのシフトも停止できます。コードの抜粋をここに示します。
1.次のコード行をBottomNevigationViewに追加します。
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="@dimen/seventy_dp"
android:layout_semitransparent="true"
android:background="@color/colorBottomNev"
android:showAsAction="always|withText"
app:itemIconTint="@drawable/bottom_navigation_colors"
app:itemTextColor="@drawable/bottom_navigation_colors"
app:itemTextAppearanceActive="@style/BottomNavigationViewTextStyle"
app:itemTextAppearanceInactive="@style/BottomNavigationViewTextStyle"
app:menu="@menu/bottom_navigation_menu"
app:labelVisibilityMode="labeled"/>
2.次のようにメニュー項目を追加します。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_catalogue"
android:icon="@drawable/catalogue"
android:title="@string/catalogue"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_contracts"
android:icon="@drawable/contract"
android:title="@string/contracts"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_prospects"
android:icon="@drawable/prospect"
android:title="@string/prospects"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_performance"
android:icon="@drawable/performance"
android:title="@string/performance"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_advance"
android:icon="@drawable/advance"
android:title="@string/advance"
android:enabled="true"
app:showAsAction="ifRoom" />
</menu>
3.このスタイルをstyle.xmlファイルに追加します。
<style name="BottomNavigationViewTextStyle">
<item name="android:fontFamily">@font/montmedium</item>
<item name="android:textSize">10sp</item>
<item name="android:duplicateParentState">true</item>
<item name="android:ellipsize">end</item>
<item name="android:maxLines">1</item>
</style>
4)これらをDimenフォルダに追加します
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_text_size" tools:override="true">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">10sp</dimen>
</resources>
私はこれらのリンクとリンクから助けを得ました。これらの リンクを研究することで助けを得ることもできます。これは私に多くの助けになります。ありがとう...