Làm cách nào để tắt chế độ dịch chuyển bottomNavlationView?


146

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.

nhập mô tả hình ảnh ở đây


1
Bản sao có thể có của thanh Điều hướng dưới cùng mới
Radhey

Đây là một câu trả lời hữu ích nếu bạn muốn xóa hoàn toàn bất kỳ hoạt hình nào: stackoverflow.com/a/51052247/2352699
Fred Porciúncula

Câu trả lời:


330

Thực hiện BottomNavigationViewcó đ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 disableShiftModephươ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 mShiftingModetrường.

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}

Cảm ơn Muhammad Alfaifi đã chỉ ra vấn đề nàycung 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


10
**** Proguard :(
Muhammad Alfaifi

17
Trường sẽ bị xáo trộn nên không có cách nào thay đổi giá trị của nó trừ khi bạn loại trừ nó trong tệp quy tắc bảo vệ của bạn
Muhammad Alfaifi

8
-keep classmembers class android.support.design.iternal.BottomNavlationMothyView {boolean mShiftingMode; }
Muhammad Alfaifi

8
Đôi khi, tôi thực sự tự hỏi tại sao Google buộc nó xem triển khai trên các nhà phát triển. Mặc dù có 4 tùy chọn trên chính ứng dụng Google+, nhưng tính năng đơn giản này có thể truy cập được thông qua một chức năng đơn giản nếu có sẵn! Vấn đề tương tự cũng xảy ra với TabLayout đã được sửa rất nhiều sau đó trong thư viện hỗ trợ. Cảm ơn vì cách giải quyết đó với Bản gốc gốc và @MuhammadAlfaifi vì đã cải thiện điều này.
sud007

19
Thư viện hỗ trợ mới (28.0.0-alpha1) hỗ trợ thay đổi hành vi này thông qua ứng dụng: nhãnVisibilityMode = "được gắn nhãn"
Jolanda Verhoef

50

Vì thư viện hỗ trợ 28.0.0-alpha1:

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />

1
Tôi đang sử dụng phiên bản thư viện hỗ trợ này nhưng vẫn không gặp lỗi về "nhãnVisibilityMode".
Sagar Maiyad

1
Làm việc đúng cách. Không cần phải đi suy ngẫm. Cảm ơn rất nhiều
Bhupesh

1
@Riser đảm bảo bạn app:không sử dụngandroid:
Carson Holzheimer

28

Để 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"

không làm việc. Tôi tin rằng tôi chỉ cần thêm phần này vào /values/dples.xml?
Rohan Kandwal

10
@RohanKandwal cần thêmtools:override="true"
Boy

@Boy Cảm ơn, sẽ thử.
Rohan Kandwal

chỉ thay đổi kích thước văn bản.
Các Dude

Tôi chỉ cần đặt như thế này vào tệp dimens.xml của mình:<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
Fernando Barbosa

22

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.
  • autosẽ 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.

1
cảm ơn Lunkie! Đây là giải pháp tốt nhất và dễ nhất đối với tôi
Gregriggins36

Nơi để thêm dòng mã này. Tôi đã cố gắng để thêm nhưng có một lỗi không tìm thấy.
Abdulwahid

@Abdulwahid bạn có thể thêm phần này vào xml của thanh điều hướng phía dưới một khi bạn có thư viện hỗ trợ 28 trở lên
Aidan Laing

@Lunkie cảm ơn bây giờ thì rõ ràng một khi thư viện hỗ trợ 28
Abdulwahid

17

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 kotlin. tại sao chúng ta cần sử dụng chú thích này @SuppressLint ("RestrictedApi") bạn có thể giải thích được không?
Ranjith Kumar

11

Làm việc cho tôi

bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

hoặc là

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />

Của tôi đã hoạt động tốt cho đến khi mục tiêu = 27 nhưng từ mục tiêu = 28, nó bị hỏng, văn bản không còn hiển thị. Nhưng setLabelVisibilityMode thực hiện thủ thuật cho tôi, giờ hoạt động như một cơ duyên
đùa4me

10

Để 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>

Người ta có thể Navigate-> File...> design_bottom_navigation_item.xmlđể thấy rằng không có cách nào khác.
arekolek

6

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());
        }
    }
}

bạn có thể sử dụng mã này dưới đây. @SuppressLint ( "RestrictedApi") vui vẻ removeShiftMode (xem: BottomNavigationView) {val menuView = view.getChildAt (0) như BottomNavigationMenuView menuView.labelVisibilityMode = LabelVisibilityMode.LABEL_VISIBILITY_LABELED menuView.buildMenuView ()}
Sâu P

5

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

  1. Bạn có thể kiểm tra các phụ thuộc của mình bằng cách chạy tác vụ phụ thuộc và tìm kiếm số phiên bản của com.android.support:design .
  2. Để 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'


4

Đố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.


Điều này khác với app:labelVisibilityModecái gì?
wonsuc

@wonsuc đây là về hoạt hình của biểu tượng và văn bản mục được chọn đang hoạt hình. Trong khi nhãnVisibilityMode là để hiển thị cho dù bạn muốn hiển thị biểu tượng bằng văn bản hay chỉ biểu tượng sẽ được hiển thị khi được chọn.
Lester L.

3

Để BottomNavigationViewthê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

Chế độ điều hướng dưới cùng của Android Tắt Văn bản và Shift


3

Rất đơn giản, chỉ cần thêm một thuộc tính trong bottomNaviationView

app:labelVisibilityMode="unlabeled"

2

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.


1
@ abbath0767 bạn đã thấy link này chưa? Có thể hữu ích cho bạn.
Kishan Solanki

Tôi nghĩ rằng tôi đã thử tất cả mọi thứ, cảm ơn bạn rất nhiều, không mong đợi trực tiếp tìm thấy câu trả lời tôi đang tìm kiếm.
BekaBot

1
Niềm vui @BekaBot
Kishan Solanki

2

Đâ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


2

Để loại bỏ hoàn toàn hình ảnh động:

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;
}

Android 9 (API cấp 28) giới thiệu các hạn chế mới đối với việc sử dụng giao diện không phải SDK và điều này sẽ không hoạt động nếu nhắm mục tiêu 28. developer.android.com/about/versions/pie/
trộm

2

cập nhật thư viện hỗ trợ của bạn lên 28.0.0.

bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

1

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


0

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")


0

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>


-1

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ếtliê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....

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.