BottomNavigationView 3'ten fazla Öğeye sahip: sekme başlığı gizleniyor


85

BottomNavigationView'i Android Support Desing Library 25 ile kullanıyorum. Ancak sekmeleri değiştirdiğimde diğer sekmenin başlığı gizleniyor. Ancak gerçek Alt Gezinme Görünümü'nde gizlenme sorunu yoktur. Ama benimki saklanıyor.

MyBottomNavigation

Ama ben öyle görünmesini istiyorum. Bunu yapmak için herhangi bir fikrin var mı? Neyi kaçırıyorum?

ActualBottomNavigation

İşte kodum:

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>

app:showAsAction="alwaysyerine denediniz miifRoom
Yassine BELDI

Denedim ama hala saklanıyor
Yunus Haznedar


1
@YunusHaznedar, eğer öğe 3'ten fazlaysa metin her zaman gizlenir ...
Shashank Verma

1
Hey, @DanXPrado çözümü paylaştığınız için teşekkürler. Cevabınızı kabul edildi olarak işaretledim. Mutlu kodlamalar.
Yunus Haznedar

Yanıtlar:


143

Yansıma kullanan çözüm artık çalışmıyor çünkü mShiftingMode alanı kaldırıldı.

Şimdi bunu yapmak için kolay bir yolu var: Kullanım Desteği Kütüphanesi 28 veya daha yüksek ve sadece eklemek app:labelVisibilityMode="labeled"için için BottomNavigationViewXML bildirimi.

Umarım yardımcı olur.


Bir şampiyon gibi çalışmak, ancak onu dairesel kaydırılabilir hale getirmek nasıl?
Shailendra Madda

@ShylendraMadda Bu soruyla ilgili olmadığı için bunu yeni bir soru olarak göndermenizi öneririm.
Danilo Prado

1
Bu nasıl varsayılan davranış değil ... app: showAsAction, android: visible, android: enabled ve bir sürü başka hack ile birkaç saatimi boşa harcadım. Teşekkürler!
Danish Khan

94

GÜNCELLEME

removeShiftMode () artık gerekli değildir, çünkü 28.0.0-alpha1 destek kitaplığında artık Etiket ekleyebiliriz .

XML'de:

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

Programlı olarak değişiklik için:

mBottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); 

Bunun çalışması için: tasarım destek kitaplığını 28.0.0-alpha1'e güncelleyin

İşte iyi bir okuma

ESKİ DESTEK KÜTÜPHANESİ İÇİN:

sizin de bottom_bar_menu.xml.Herhangi showAsActionözniteliği

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

build.gradle'da:

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

3'DEN FAZLA ÖĞE GÖRÜNÜMÜ ALT NAVİGASYON: removeShiftMode()yöntemi kullanma

içinde BottomNavigationViewHelper.javaKullanımı:

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

Kullanarak arayın:

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

Başlık metninin kaydırma animasyonunu devre dışı bırakır ve metnin görüntülenmesini sağlar.


2
Hayır, hala saklanıyor. "Her zaman" ve "her zaman | Metinle" denedim
Yunus Haznedar

1
öğe başlığınızdan biri büyük diğerinin görünümünün engellenmesine neden oluyor mu? küçük başlık ve çekilebilir resimlerle deneyin ..
rafsanahmad007

1
takip ettiğiniz eğitimde bu satırı görünIt’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
Harika cevap, Teşekkürler
Hamza Abdullah

2
Yansıma çözümü üzerinde oldukça iyi çalışıyor com.android.support:design:25.4.0, ancak başarısız oluyor com.android.support:design:26.1.0, bu yüzden hedef SDK ve bağımlılıkların sürümünü biraz geri alıyorum.
Evi Şarkı

10

BottomNavigationView kaynak kodunu taradıktan sonra buluyorum

mShiftingMode = mMenu.size() > 3;

içinde BottomNavigationMenuView.java hattı 265, bu menü boyutu en fazla 3 iken, sekme başlık hid girecek olup anlamına gelir. Bu nedenle, sekme başlığını göstermek istiyorsanız, yalnızca derlemeden kod almanız ve aşağıya değiştirmeniz gerekir.

mShiftingMode = mMenu.size() > 5;

Not: BottonNavigationView maksimum sekme sayısı 3 ile 5 arasında olmalıdır. BottomNavigationViewNew'de kod alabilirsiniz. görüntü açıklamasını buraya girin


BottomNavigationView'ı genişleten kendi CustomBottomView'ım var, bunun yerine bu özelliği ayarlamanın bir yolu var mı?
JPM

1
3 sekme sınırı ile ilgili olan "BottomNavigationMenuView" satırını görmüyorum. Belki kod değişmiştir?
android geliştiricisi

8

BottomNavigationViewHelper Sınıfı Oluştur

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

Aramak

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

1
RestrictAPI açıklama sorununu çözen SuppressLint'e sahiptir
code4j

3

Kotlin uzantısı işlevi:

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

Teşekkürler bayım. Çok minnettarım
Yunus Haznedar

1
item.setShiftingMode(false)şimdiitem.setShifting(false)
Sim

2

Rafsanahmad007 cevabını çok kullandım ama Kotlin'e tercüme ettim. Gelecekteki gezginler için paylaşmama izin ver

@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
Bu çözüm artık geçerli değil, kabul edilen çözüm @
DanXPrado'ya

Bana haber verdiğiniz için teşekkürler
Karma Maker

1

Bu durumda geçerli olmasa bile dikkat edilmesi gereken bir şey.

Bu model, gezinmek için 3 ila 5 üst düzey hedefiniz olduğunda kullanılabilir.

Simge başlığının görüntülenmesini etkinleştirmek için aşağıdakileri yapın:

  1. Menü (bottom_navigation_menu) öğe XML'inizin aşağıdaki gibi yapılandırıldığından emin olun: -

    <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. Aşağıdakileri BottomNavigationView kod uygulamasına ekleyin: labelVisibilityMode = "etiketli"

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


0

Bu benim için API 26'da çalışıyor:

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


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

Bu yöntemi, aramak istediğiniz Faaliyet veya Parçanızda yapın:

 @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

Bunu, BottomNevigationView'da 3 ila 5 öğe için hem metni hem de simgeleri göstermek için kullanabilir ve kaydırmayı durdurabilirsiniz.

 app:labelVisibilityMode="labeled"

Ancak BottmNevigationView'da 5 öğe için uzun metin kesme sorunuyla karşılaşacaksınız. bunun için, BottomNevigationView simgelerinin yanı sıra metnin kaydırılmasını durdurmak için iyi bir çözüm buldum. BottomNevigationView'daki Simgelerin yanı sıra metnin kaydırılmasını da durdurabilirsiniz. Kod parçacıkları burada verilmiştir.

1. Bunu BottomNevigationView'a gösterildiği gibi bir miktar kod satırı ekleyin

<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. Aşağıdaki gibi Menü Öğeleri ekleyin: -

 <?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. Bu stili style.xml dosyasına ekleyin:

 <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) Bunları Dimen klasörüne ekleyin

<?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>

Bu bağlantı ve bağlantıdan yardım aldım, bu bağlantıları inceleyerek de yardım alabilirsiniz, bu bana çok yardımcı oluyor, umarım bu da size yardımcı olur. Teşekkürler....


0

hızlı düzeltildi sadece uygulamayı ekleyin: labelVisibilityMode = xml'de "etiketli"

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

Not

  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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.