BottomNavlationView không hiển thị tiêu đề của menu không hoạt động.
Làm cách nào để hiển thị tiêu đề của tất cả các thành phần menu trong bottomNavulationBar? Vấn đề là trong trường hợp của tôi chỉ hiển thị tiêu đề của phần tử được nhấp.
BottomNavlationView không hiển thị tiêu đề của menu không hoạt động.
Làm cách nào để hiển thị tiêu đề của tất cả các thành phần menu trong bottomNavulationBar? Vấn đề là trong trường hợp của tôi chỉ hiển thị tiêu đề của phần tử được nhấp.
Câu trả lời:
Thực hiện BottomNavigationView
có điều kiện: khi có nhiều hơn 3 mục thì sử dụng chế độ shift.
Tại thời điểm này, bạn không thể thay đổi nó thông qua API hiện có và cách duy nhất để tắt chế độ thay đổi là sử dụng sự phản chiếu.
Bạn sẽ cần lớp người trợ giúp:
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);
}
}
}
Và sau đó áp dụng disableShiftMode
phương thức trên của bạn BottomNavigationView
, nhưng hãy nhớ nếu bạn đang xem chế độ xem menu từ mã của mình, bạn phải thực hiện nó sau khi lạm phát.
Ví dụ sử dụng:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
Tái bút
Hãy nhớ rằng, bạn sẽ cần phải thực hiện phương pháp này mỗi khi bạn thay đổi các mục menu trong BottomNavigationView
.
CẬP NHẬT
Bạn cũng cần cập nhật tệp cấu hình proguard (ví dụ: proguard-rules.pro), mã ở trên sử dụng sự phản chiếu và sẽ không hoạt động nếu proguard che khuất mShiftingMode
trường.
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
Cảm ơn Muhammad Alfaifi đã chỉ ra vấn đề này và cung cấp đoạn trích .
CẬP NHẬT 2
Như Jolanda Verhoef đã chỉ ra thư viện Hỗ trợ mới ( 28.0.0-alpha1
) và thư viện Thành phần Vật liệu mới ( 1.0.0-beta01
) cung cấp một thuộc tính công cộng có thể được sử dụng để thao tác chế độ dịch chuyển trên 3 mục menu.
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
Trong thư viện Thành phần vật liệu, nó cũng được áp dụng nếu có 5 mục menu.
CẬP NHẬT 3
Như @ThomasSunderland cũng chỉ ra, bạn có thể đặt thuộc tính này thành false app:itemHorizontalTranslation="false"
mà không có hậu tố Enabled
để vô hiệu hóa chuyển động.
bạn có thể kiểm tra hướng dẫn đầy đủ để tạo kiểu cho bottomNavulation tại đây
Vì thư viện hỗ trợ 28.0.0-alpha1:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
app:
không sử dụngandroid:
Để vô hiệu hóa hoạt hình văn bản, bạn cũng có thể sử dụng điều này trong tệp dimens.xml của mình:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
Bạn cũng có thể cần phải thêm điều này trong bảng kê khai của bạn:
tools:override="true"
tools:override="true"
<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
Bây giờ bạn có thể sử dụng app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
trong28-alpha
labeled
sẽ giữ cho tất cả các nhãn có thể nhìn thấy.unlabeled
sẽ chỉ hiển thị các biểu tượng.selected
sẽ chỉ hiển thị nhãn cho mục đã chọn và các mục dịch chuyển.auto
sẽ chọn nhãn hoặc chọn dựa trên số lượng mặt hàng bạn có. dán nhãn cho 1-3 mặt hàng và được chọn cho hơn 3 mặt hàng.Câu trả lời của Przemysław trong Kotlin là một hàm mở rộng
@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)
}
}
Cách sử dụng (với Tiện ích mở rộng Android của Kotlin):
bottom_navigation_view.disableShiftMode()
Làm việc cho tôi
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
hoặc là
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
Để vô hiệu hóa hoạt hình văn bản và giảm kích thước phông chữ, hãy sử dụng tệp này trong tệp dimens.xml của bạn:
<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
để thấy rằng không có cách nào khác.
CẬP NHẬT
trong phiên bản sdk Android 28 trở lên, họ đã đổi item.setShiftingMode(false)
thànhitem.setShifting(false)
Ngoài ra họ đã loại bỏ các lĩnh vực mShiftingMode
Vì vậy, việc sử dụng sẽ được
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());
}
}
}
Như những người khác đã chỉ ra, vì thư viện hỗ trợ 28.0.0-alpha1 có thể:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
hoặc bạn có thể thiết lập nó theo chương trình .
Lưu ý: nếu bạn đang nâng cấp từ phiên bản cũ hơn của thư viện hỗ trợ, đừng quên nâng cấp phiên bản SDK biên dịch. Kiểm tra các phiên bản của thư viện hỗ trợ tại đây: Các phiên bản Thư viện hỗ trợ
Tuy nhiên, bạn vẫn có thể nhận được nhãnVisibilityMode không tìm thấy khi biên dịch, nếu ứng dụng của bạn phụ thuộc vào các phiên bản cũ hơn của thư viện hỗ trợ thiết kế. Nếu đây là trường hợp, hãy thử nâng cấp lên một phiên bản của phụ thuộc nhất định, điều đó phụ thuộc vào ít nhất là phiên bản 28.0.0-alpha1 của thư viện hỗ trợ thiết kế. Nếu điều đó là không thể, hãy xác định rõ ràng sự phụ thuộc.
Nếu bạn sử dụng Gradle
Để thêm phụ thuộc hỗ trợ thiết kế một cách rõ ràng trong build.gradle của bạn :
triển khai 'com.android.support:design:28.0.0'
Đối với câu trả lời cập nhật bằng cách sử dụng mặc định. Cập nhật thư viện thiết kế mới nhất
triển khai "com.android.support:design:28.0.0"
và đặt vào các thuộc tính xml bottomNavlationView của bạn
app:itemHorizontalTranslationEnabled="false"
bạn cũng có thể đặt nó theo lập trình
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
Bạn có thể tìm thấy nguồn ở đây bottomNavlationView
Hy vọng điều này sẽ giúp bạn.
app:labelVisibilityMode
cái gì?
Để BottomNavigationView
thêm của bạnapp: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>
dẫn đến kết quả như sau
Rất đơn giản, chỉ cần thêm một thuộc tính trong bottomNaviationView
app:labelVisibilityMode="unlabeled"
Tôi đã có một số hành vi kỳ lạ với bottomNavlationView. Khi tôi đang chọn bất kỳ mục / đoạn nào trong đó, đoạn đó sẽ đẩy bottomNavestionView xuống thấp hơn một chút, do đó văn bản của bottomNavlationView nằm bên dưới màn hình, do đó chỉ có các biểu tượng được hiển thị và văn bản bị ẩn khi nhấp vào bất kỳ mục nào.
Nếu bạn đang phải đối mặt với hành vi kỳ lạ đó thì đây là giải pháp. Chỉ cần loại bỏ
android:fitsSystemWindows="true"
trong bố trí gốc của bạn của mảnh. Chỉ cần loại bỏ điều này và bùng nổ! BottomNavestionView sẽ hoạt động tốt, bây giờ nó có thể được hiển thị với văn bản và biểu tượng. Tôi đã có điều này trong Điều phối viên gốc của tôi.
Cũng đừng quên thêm
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
trong hoạt động của bạn để vô hiệu hóa chế độ thay đổi. Mặc dù nó không liên quan chính xác đến câu hỏi được hỏi, nhưng tôi vẫn thấy điều này hữu ích.
Đây là thư viện của bên thứ ba tôi sử dụng và nó có nhiều tùy chọn tùy chỉnh như tắt chế độ dịch chuyển, chỉ hiển thị các biểu tượng, cài đặt kích thước biểu tượng, v.v. bottomNavlationViewEx
Nếu bạn cũng muốn thoát khỏi hoạt hình lề nhỏ khó chịu đó, bạn cần thêm mã phản chiếu. Đây là giải pháp hoàn chỉnh loại bỏ mọi hoạt ảnh:
@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");
}
}
Và đảm bảo thêm nó vào tập tin cấu hình proguard của bạn:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
cập nhật thư viện hỗ trợ của bạn lên 28.0.0.
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
Nếu bạn đang sử dụng bộ phận hỗ trợ: design: 28.0.0, hãy thêm ứng dụng dòng này: nhãnVisibilityMode = "không gắn nhãn" vào bottomNavlationView của bạn
chỉ muốn thêm vào phía trên phương thức này vô hiệu hóaShiftMode thêm mã bên dưới. @SuppressLint ("RestrictedApi")
https://android.jlelse.eu/disable-shift-label-animation-from-bottom-navlation-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>
Bạn có thể sử dụng điều này để hiển thị cả văn bản và biểu tượng trên bottomNevestionView cho 3 đến 5 mục và ngừng dịch chuyển.
app:labelVisibilityMode="labeled"
Nhưng bạn sẽ phải đối mặt với vấn đề cắt văn bản dài trên BottmNevlationView cho 5 mục. cho điều đó, tôi đã tìm thấy một giải pháp tốt để ngừng dịch chuyển văn bản cũng như các biểu tượng của bottomNevlationView. Bạn cũng có thể dừng dịch chuyển văn bản cũng như Biểu tượng trên bottomNevestionView. Snipshots mã được đưa ra ở đây.
1. Thêm dòng mã này vào bottomNevlationView như được hiển thị
<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. Thêm các mục menu như sau: -
<?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.Thêm kiểu này trong tệp 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) Thêm chúng trong thư mục 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>
Tôi đã nhận được sự giúp đỡ từ các liên kết và liên kết này . Bạn cũng có thể nhận trợ giúp bằng cách nghiên cứu các liên kết này . Điều này giúp tôi rất nhiều. Hy vọng điều này cũng giúp bạn. Cảm ơn....