BottomNavestionView hiển thị cả biểu tượng và nhãn văn bản mọi lúc


124

Tôi đang sử dụng android.support.design.widget.BottomNavlationView từ thư viện hỗ trợ thiết kế phiên bản 25

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

Khi chỉ có ba hành động trong @ menu / bottom_navlation_main, nó sẽ hiển thị cả biểu tượng và nhãn văn bản mọi lúc.

Cách để hiển thị cả biểu tượng và nhãn văn bản mọi lúc khi có nhiều hơn ba hành động.


Trong menu bottom_navlation_main.xml của bạn, nếu bạn có android: showAsAction = "ifRoom", hãy đổi nó thành android: showAsAction = "always" cho mỗi mục.
Shashank Udupa

Không, nó không hoạt động. tôi đã thử nó trước đây.
Nhà phát triển Android

Bạn có thể hiển thị tập tin xml menu của bạn
Shashank Udupa

'<? xml version = "1.0" mã hóa = "utf-8"?> <menu xmlns: android = " schemas.android.com/apk/res/android " xmlns: app = " schemas.android.com/apk/ res-auto "> <item android: id =" @ + id / action_favorites "app: showAsAction =" always "/> <item android: id =" @ + id / action_schedules "app: showAsAction =" always "/> < item android: id = "@ + id / action_music" app: showAsAction = "always" /> <item android: id = "@ + id / account" android: enable = "true" app: showAsAction = "always" /> </ menu> '
Nhà phát triển Android

4
đặt ứng dụng: nhãnVisibilityMode = "được gắn nhãn" trong bottomNavlationView.
ShINA

Câu trả lời:


324

Đối với bất kỳ ai vẫn đang tìm kiếm giải pháp và không muốn dựa vào thư viện của bên thứ ba hoặc phản ánh thời gian chạy, bottomNavulationView trong Thư viện hỗ trợ 28 / Jetpack hỗ trợ luôn luôn có nhãn văn bản.

Đây là phương pháp bạn đang tìm kiếm.

Hoặc trong XML, app:labelVisibilityMode="labeled"


Tôi cần phiên bản thư viện nào?
DaniloDeQueiroz

thư viện hỗ trợ 28-alpha1 +
shaishgandhi

Bạn cũng có thể thay đổi chế độ hiển thị thành "tự động" để hiển thị văn bản biểu tượng khi chỉ nhấn / tập trung. Mã: ứng dụng: nhãnVisibilityMode = "auto"
Kenny Dabiri

Bạn là người đàn ông! Cảm ơn bạn điều này hoạt động với phiên bản mới nhất của Thư viện vật liệu.
sud007

68

CẬP NHẬT TỪ NGÀY 8 THÁNG 5 NĂM 2018

Bạn có thể sử dụng app:labelVisibilityMode="labeled" trực tiếp trong<android.support.design.widget.BottomNavigationView />

Nguồn: https://developer.android.com/reference/com/google/android/m vật liệu / bottomnavlation/LabelVisibilityMode

Đừng cần giải pháp dài dưới đây.

TRẢ LỜI TRƯỚC

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.removeShiftMode(bottomNavigationView);

trong hoạt động của bạn để vô hiệu hóa chế độ thay đổi.

Đây là lớp học:

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

Điều này kết hợp với câu trả lời của STAR_ZERO đã giải quyết vấn đề của tôi!
Christopher Smit

Trong cuộc gọi bạn có disableShiftMode, và trong lớp removeShiftMode. Ngoài sự khác biệt nhỏ đó, câu trả lời của bạn đã giải quyết vấn đề cho tôi. Bây giờ tôi có năm menuitem mà không thay đổi và với văn bản + biểu tượng. Cảm ơn bạn rất nhiều!
Yamakuzure

Hoàn hảo. Khi bạn có nhiều hơn 3 mục trong điều hướng phía dưới của bạn, sẽ xuất hiện chế độ thay đổi. Sử dụng điều này, bạn có thể vô hiệu hóa sự dịch chuyển đó và do đó tất cả các biểu tượng có văn bản xuất hiện cùng một lúc.
Kishor Bikram Oli

1
Đây là api không giới hạn và nó không hoạt động trên thư viện hỗ trợ phiên bản 28. +. Câu trả lời @shaishgandhi được chấp nhận là cách thích hợp hơn để làm điều đó.
okarakose

19

Đó là khó khăn trong phiên bản 25.

Hãy thử mã này. Nhưng tôi nghĩ đó không phải là giải pháp tốt.

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

Trong Android Studio, nên thêm mã như thế này: `` `// noinspection RestrictedApi itemView.setShiftingMode (false); // noinspection RestrictedApi itemView.setChecked (false); `` `
Jiezhi.G

4
nó vẫn chuyển các mục
CodeToLife

1
Hoàn hảo !! hiển thị cả biểu tượng và văn bản. Nhưng chế độ chuyển (sai) không hoạt động.
Minkoo

Điều này kết hợp với câu trả lời của KishanSolanki124 đã giải quyết vấn đề của tôi!
Christopher Smit

11

Đây là chức năng mở rộng của Kotlin kết hợp giải pháp của @STAR_ZERO và @ KishanSolanki124.

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

Để dùng nó:

myBottomNavigation.disableShiftMode()

10

Bạn có muốn hiệu ứng này?

Nhấn vào đây để xem hình ảnh

Nếu vậy, tôi đề nghị bạn thử BottomNavigationViewEx .


1
Thư viện của bạn hoạt động tốt và ấn tượng Nhưng tôi đã tìm cách đạt được chức năng này bằng thư viện thiết kế 25.0.0 Thật không may, điều đó trái với thực tiễn thiết kế
Android

Điều này không trái với thông số kỹ thuật của Thiết kế Vật liệu, theo "Thanh điều hướng dưới cùng cố định" trong tài liệu . Ngoài ra, cảm ơn cá nhân của tôi đã chia sẻ thư viện tuyệt vời này.
Serg de Adelantado

1
Điều này chống lại các thông số kỹ thuật thiết kế vật liệu. Nếu bạn đọc tài liệu mà bạn cung cấp, bạn sẽ thấy rằng nó rõ ràng nói rằng "Nếu có bốn hoặc năm hành động, chỉ hiển thị các chế độ xem không hoạt động dưới dạng biểu tượng".
Felipe

8

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 bottomNevlationView

app:labelVisibilityMode="labeled"

Nếu bạn đang sử dụng, bạn sẽ có thể xem cả biểu tượng và văn bản

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

6

Bạn có thể sử dụng ứng dụng: nhãnVisibilityMode = "được gắn nhãn" trực tiếp trong

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:labelVisibilityMode="labeled"
        android:elevation="8dp"
        android:layout_alignParentBottom="true"
        app:itemBackground="@drawable/bottom_navi"
        app:itemTextColor="@color/white"
        app:itemIconTint="@color/white"
        app:menu="@menu/bottom_nav_menu_managment" />

5

trong lớp bottomNavlationView có trường bottomNavlationMothyView và trong bottomNavlationMothyView có trường bottomNavlationItemView [], là các mục trong thanh dưới cùng.

Giả sử n là số lượng vật phẩm, bottomNavlationMothyView sẽ gọi bottomNavlationItemView.setShiftingMode (n> 3) trên mỗi thành viên của mảng bottomNavlationItemView []. Hàm này quyết định hành vi (hiển thị tiêu đề luôn hoặc chỉ khi lựa chọn).

Vì vậy, cách để luôn hiển thị các tiêu đề là cố gắng gọi phương thức này và bạn có thể sử dụng sự phản chiếu để truy cập vào các trường riêng.

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

Điều này là rất tốt, chỉ cần chúng tôi đảm bảo rằng bottomNavlationMothyView cũng không thay đổi. -> f = menuView.getClass (). getDeclaredField ("mShiftingMode"); f.setAccessible (đúng); f.setBoolean (menuView, sai);
k.

4

Để hiển thị các tiêu đề tất cả các cách. Hãy thử mã Kotlin này:

@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)
    }
}

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.