BottomNavigationView với hơn 3 mục: tiêu đề tab đang ẩn


85

Tôi đang sử dụng BottomNavigationView với việc sử dụng Thư viện Desing hỗ trợ Android 25. Nhưng khi tôi chuyển đổi các tab, tiêu đề của tab khác sẽ bị ẩn. Nhưng không có vấn đề gì ẩn Chế độ xem Điều hướng Dưới cùng. Nhưng của tôi đang trốn.

MyBottomNavigation

Nhưng tôi muốn nó trông như thế. Bất kỳ ý tưởng để làm điều đó? Tôi đang thiếu gì?

ActualBottomNavigation

Đây là mã của tôi:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.yunus.ototakip.MainActivity">

<FrameLayout
    android:id="@+id/main_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottom_navigation"
    android:layout_alignParentTop="true">
</FrameLayout>

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemBackground="@color/colorPrimary"
    app:itemIconTint="@color/beyaz"
    app:itemTextColor="@color/beyaz"
    app:menu="@menu/bottombar_menu" />

bottom_bar_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
 <item
android:id="@+id/bb_menu_arac"
android:enabled="true"
android:icon="@drawable/icon_car"
android:title="@string/araclarim"
app:showAsAction="ifRoom" />
 <item
android:id="@+id/bb_menu_yakin"
android:enabled="true"
android:icon="@drawable/icon_yer"
android:title="@string/yakinimdakiler"
app:showAsAction="ifRoom" />
  <item
android:id="@+id/bb_menu_yaklasan"
android:enabled="true"
android:icon="@drawable/icon_takvim"
android:title="@string/yaklasanlar"
app:showAsAction="ifRoom" />

<item
    android:id="@+id/bb_menu_ipucu"
    android:enabled="true"
    android:icon="@drawable/icon_ipucu"
    android:title="@string/ipuclari"
    app:showAsAction="ifRoom" />
 </menu>

bạn đã cố gắng app:showAsAction="alwaysthay vìifRoom
Yassine BELDI

Tôi đã cố gắng, nhưng nó vẫn còn lẩn trốn
Yunus Haznedar


1
@YunusHaznedar nếu mục nhiều hơn 3 thì văn bản sẽ luôn ẩn ...
Shashank Verma

1
Xin chào, @DanXPrado cảm ơn bạn đã chia sẻ giải pháp. Tôi đã đánh dấu câu trả lời của bạn là được chấp nhận. Chúc bạn viết mã vui vẻ.
Yunus Haznedar

Câu trả lời:


139

Giải pháp sử dụng phản chiếu không hoạt động nữa vì trường mShiftingMode đã bị xóa.

Có một cách dễ dàng để làm điều đó ngay bây giờ: Sử dụng Thư viện hỗ trợ 28 và chỉ cần thêm app:labelVisibilityMode="labeled"vào BottomNavigationViewkhai báo XML của bạn .

Hy vọng nó giúp.


Làm việc như một nhà vô địch, nhưng làm thế nào để làm cho nó có thể cuộn được?
Shailendra Madda

@ShylendraMadda Tôi khuyên bạn nên đăng câu hỏi đó như một câu hỏi mới vì nó không liên quan đến câu hỏi này.
Danilo Prado

1
Làm thế nào đây không phải là hành vi mặc định ... Tôi đã lãng phí một vài giờ với ứng dụng: showAsAction, android: hiển thị, android: đã kích hoạt và một loạt các bản hack khác. Cảm ơn!
Khan tiếng Đan Mạch

94

CẬP NHẬT

removeShiftMode () không còn cần thiết nữa, vì trong thư viện hỗ trợ 28.0.0-alpha1 giờ đây chúng ta có thể thêm Nhãn .

Trong XML:

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

Đối với thay đổi theo chương trình:

mBottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); 

Để điều này hoạt động: hãy cập nhật thư viện hỗ trợ thiết kế lên 28.0.0-alpha1

Đây là một bài đọc hay

CHO THƯ VIỆN HỖ TRỢ NGƯỜI LỚN:

trong của bạn. bottom_bar_menu.xmlThay đổi showAsActionthuộc tính

<item android:id="@id/menu_item"
android:title="text"
android:icon="@drawable/drawable_resource_name"
android:showAsAction="always|withText" />

trong build.gradle:

compile 'com.android.support:design:25.3.1'

ĐÁNH GIÁ ĐÁNH GIÁ HƠN 3 MỤC: sử dụng removeShiftMode()phương pháp

đang BottomNavigationViewHelper.javasử dụng:

import android.annotation.SuppressLint;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import java.lang.reflect.Field;

    public class BottomNavigationViewHelper {
        @SuppressLint("RestrictedApi")
        public static void removeShiftMode(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("BottomNav", "Unable to get shift mode field", e);
            } catch (IllegalAccessException e) {
                Log.e("BottomNav", "Unable to change value of shift mode", e);
            }
        }
    }

Gọi nó bằng cách sử dụng:

BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);

Nó sẽ tắt hoạt ảnh dịch chuyển của văn bản tiêu đề và cho phép văn bản được hiển thị.


2
Không, nó vẫn đang trốn. Tôi cố gắng "luôn luôn" và "luôn luôn | withText"
Yunus Haznedar

1
một trong những tiêu đề mục của bạn quá lớn đang khiến chế độ xem của người khác bị chặn? hãy thử với tiêu đề nhỏ và hình ảnh có thể vẽ được ..
rafsanahmad007

1
xem dòng này trên hướng dẫn mà bạn đang theo dõiIt’s important to note that the maximum number of items we can display is 5. This may change at any point, so it’s important to check this by using the getMaxItem() method provided by the BottomNavigationView class rather than hard-coding the value yourself.
rafsanahmad007

1
câu trả lời tuyệt vời, Cảm ơn
Hamza Abdullah

2
Giải pháp phản chiếu hoạt động khá tốt com.android.support:design:25.4.0, nhưng không thành công com.android.support:design:26.1.0, vì vậy tôi quay lại một chút phiên bản SDK mục tiêu và phụ thuộc.
Evi Song

10

Sau khi quét mã nguồn của BottomNavigationView, tôi thấy

mShiftingMode = mMenu.size() > 3;

trong BottomNavigationMenuView.java dòng 265, có nghĩa là trong khi kích thước menu lớn hơn 3, tiêu đề tab sẽ được ẩn. Vì vậy, nếu bạn muốn hiển thị tiêu đề tab, bạn chỉ cần lấy mã từ bản dựng và thay đổi bên dưới.

mShiftingMode = mMenu.size() > 5;

PS: Số lượng tab tối đa của BottonNavigationView phải từ 3 đến 5. Bạn có thể lấy mã trên BottomNavigationViewNew nhập mô tả hình ảnh ở đây


Tôi có CustomBottomView của riêng mình mở rộng BottomNavigationView, có cách nào để đặt thuộc tính đó thay thế không?
JPM

1
Tôi không thấy dòng "BottomNavigationMenuView" nói về giới hạn 3 tab. Có thể mã đã thay đổi?
nhà phát triển android

8

Tạo Class BottomNavigationViewHelper

import android.annotation.SuppressLint;
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 {
    @SuppressLint("RestrictedApi")
    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);
if(menuView.getChildCount()<6)
           {
            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);
        }
    }
}   

Gọi

    BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
    BottomNavigationViewHelper.disableShiftMode(bottomNavigationView); 

1
Nó có SuppressLint mà giải quyết vấn đề restrictAPI annoation
code4j

3

Chức năng mở rộng Kotlin:

@SuppressLint("RestrictedApi")
fun BottomNavigationView.removeShiftMode(){
    val menuView = this.getChildAt(0) as BottomNavigationMenuView
    try {
        val shiftingMode = menuView.javaClass.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) {
        e.printStackTrace()
        Timber.tag("BottomNav").e( e, "Unable to get shift mode field")
    } catch (e: IllegalAccessException) {
        Timber.tag("BottomNav").e( e, "Unable to change value of shift mode")
    }
}

Cảm ơn ngài. Rất cảm kích.
Yunus Haznedar

1
item.setShiftingMode(false)bây giờitem.setShifting(false)
Sim

2

Tôi đã sử dụng khá nhiều câu trả lời rafsanahmad007 nhưng dịch nó sang Kotlin. Hãy để tôi chia sẻ nó cho những người lang thang trong tương lai

@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
    val menuView = this.getChildAt(0) as BottomNavigationMenuView
    try {
        val shiftingMode = menuView::class.java.getDeclaredField("mShiftingMode")
        shiftingMode.setAccessible(true)
        shiftingMode.setBoolean(menuView, false)
        shiftingMode.setAccessible(false)
        for (i in 0..(menuView.childCount - 1)) {
            val item = menuView.getChildAt(i) as BottomNavigationItemView
            item.setShiftingMode(false)
            // set once again checked value, so view will be updated
            item.setChecked(item.getItemData().isChecked())
        }
    } catch (e: NoSuchFieldException) {
        Timber.e("Unable to get shift mode field")
    } catch (e: IllegalAccessException) {
        Timber.e("Unable to change value of shift mode")
    }
}

1
Giải pháp này là không còn giá trị, giải pháp được chấp nhận là đúng bởi @DanXPrado
jpardogo

Thx đã cho tôi biết
Karma Maker

0

Điều này phù hợp với tôi trong API 26:

 navigation = (BottomNavigationView) view.findViewById(R.id.bottom_navigation);


     try{disableShiftMode(navigation);}catch(Exception ew){}

Đặt phương thức này trong Hoạt động hoặc Phân đoạn của bạn ở nơi bạn muốn gọi:

 @SuppressLint("RestrictedApi")
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);
            item.setShiftingMode(false);

            item.setChecked(item.getItemData().isChecked());
        }
    } catch (NoSuchFieldException e) {

    } catch (IllegalAccessException e) {

    }
}

0

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 BottomNevigationView cho 3 đến 5 mục và dừ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 BottmNevigationView cho 5 mục. vì vậy, 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 BottomNevigationView. Bạn cũng có thể ngừng dịch chuyển văn bản cũng như các biểu tượng trên BottomNevigationView. Ảnh chụp mã được đưa ra ở đây.

1. Thêm một số dòng mã này trong BottomNevigationView 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 vào 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ự trợ giúp từ 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 sẽ giúp tôi rất nhiều. Hy vọng điều này cũng giúp ích cho bạn. Cảm ơn....


0

sửa nhanh chỉ cần thêm ứng dụng: labelVisibilityMode = "label" trong xml

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemBackground="@color/colorPrimary"
    app:itemIconTint="@drawable/bottom_navigation_color_selector"
    app:itemTextColor="@drawable/bottom_navigation_color_selector"
    app:labelVisibilityMode="labeled"
    app:menu="@menu/menu_bottom_navigation" />

Ghi chú

  implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'

0

Một điều cần lưu ý mặc dù nó không áp dụng trong trường hợp này.

Mẫu này có thể được sử dụng khi bạn có từ 3 đến 5 điểm đến cấp cao nhất để điều hướng đến.

Để cho phép hiển thị tiêu đề biểu tượng, hãy làm như sau:

  1. Đảm bảo rằng mục XML trong menu (bottom_navigation_menu) của bạn có cấu trúc như sau: -

    <item
        android:id="@+id/action_home"
        android:enabled="true"
        android:icon="@drawable/ic_action_home"
        android:title="HOME"
        app:showAsAction="ifRoom"/>
    
    <item
        android:id="@+id/action_favourites"
        android:enabled="true"
        android:icon="@drawable/ic_action_favourite"
        android:title="FAVOURITES"
        app:showAsAction="ifRoom"/>
    
    <item
        android:id="@+id/action_basket"
        android:enabled="true"
        android:icon="@drawable/ic_action_basket"
        android:title="BASKET"
        app:showAsAction="ifRoom"/>
    

  2. Thêm phần sau vào ứng dụngBottomNavigationView: labelVisibilityMode = "label"

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="@android:color/white"
    app:itemIconTint="@android:color/black"
    app:itemTextColor="@android:color/black"
    app:menu="@menu/bottom_navigation_menu"
    app:labelVisibilityMode="labeled"/>

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.