BottomNavigationView, etkin olmayan menünün başlığını göstermez.
BottomNavigationBar'da tüm menü öğelerinin başlıkları nasıl gösterilir? Sorun şu ki, benim durumumda yalnızca tıklanan öğenin başlığı gösteriliyor.
Yanıtlar:
Has BottomNavigationView
koşulunun uygulanması : 3'ten fazla öğe olduğunda vardiya modunu kullanın.
Şu anda bunu mevcut API aracılığıyla değiştiremezsiniz ve vardiya modunu devre dışı bırakmanın tek yolu yansımayı kullanmaktır.
Yardımcı sınıfa ihtiyacınız olacak:
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);
}
}
}
Ve sonra disableShiftMode
yöntemi uygulamanıza uygulayın BottomNavigationView
, ancak kodunuzdan menü görünümünü şişiriyorsanız, şişirdikten sonra çalıştırmanız gerektiğini unutmayın.
Örnek kullanım:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
PS.
Unutmayın, menü öğelerini her değiştirdiğinizde bu yöntemi uygulamanız gerekecek BottomNavigationView
.
GÜNCELLEME
Ayrıca proguard yapılandırma dosyasını (örn. Proguard-rules.pro) güncellemeniz gerekir, yukarıdaki kod yansıma kullanır ve proguard mShiftingMode
alanı gizlerse çalışmaz .
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
Bu sorunu işaret ettiği ve pasajı sağladığı için teşekkürler Muhammad Alfaifi .
GÜNCELLEME 2
Jolanda Verhoef'in belirttiği gibi, yeni Destek kitaplığı ( 28.0.0-alpha1
) ve ayrıca yeni Malzeme Bileşenleri kitaplığı ( 1.0.0-beta01
), kaydırma modunu 3 menü öğesi üzerinde değiştirmek için kullanılabilecek bir genel özellik sunar.
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
Malzeme Bileşenleri kitaplığında, 5 menü öğesi varsa da geçerlidir.
GÜNCELLEME 3
@ThomasSunderland'ın da belirttiği gibi, animasyonu kaydırmayı devre dışı bırakmak için bu özelliği postfix app:itemHorizontalTranslation="false"
olmadan false olarak ayarlayabilirsiniz Enabled
.
Eğer BottomNavigation stil tam rehber kontrol edebilirsiniz burada
Destek kitaplığı 28.0.0-alpha1'den beri :
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
app:
değilandroid:
Metin animasyonunu devre dışı bırakmak için bunu dimens.xml dosyanızda da kullanabilirsiniz:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
Bunu ayrıca bildiriminize eklemeniz gerekebilir:
tools:override="true"
tools:override="true"
<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
Artık kullanabilirsiniz app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
içinde28-alpha
labeled
tüm etiketleri görünür tutar.unlabeled
yalnızca simgeleri gösterecektir.selected
yalnızca seçili öğe ve vardiya öğelerinin etiketini gösterir.auto
sahip olduğunuz ürün sayısına göre etiketlenen veya seçilenleri seçecektir. 1-3 öğe için etiketlenmiş ve 3+ öğe için seçilmiştir.Przemysław'ın Kotlin'deki bir uzantı işlevi olarak cevabı
@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)
}
}
Kullanım (Kotlin Android Uzantıları ile):
bottom_navigation_view.disableShiftMode()
Metin animasyonunu devre dışı bırakmak ve yazı tipi boyutunu küçültmek için bunu dimens.xml dosyanızda kullanı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
başka hiçbir yolu olmadığını görmek için.
Benim için çalışıyor
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
veya
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
GÜNCELLEME
Android'in sdk sürümü 28 ve üzeri onlar değişti item.setShiftingMode(false)
etmekitem.setShifting(false)
Ayrıca alanı da kaldırdılar mShiftingMode
Yani kullanım olacak
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());
}
}
}
Diğerlerinin de belirttiği gibi, destek kitaplığı 28.0.0-alpha1'den bu yana mümkündür:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
veya programlı olarak ayarlayabilirsiniz .
Not: Destek kitaplığının daha eski bir sürümünden yükseltme yapıyorsanız, derleme SDK sürümünü yükseltmeyi unutmayın. Destek kitaplığı sürümlerini buradan kontrol edin: Destek Kitaplığı sürümleri
Ancak, uygulamanız tasarım destek kitaplığının eski sürümlerine bağlıysa, derleme sırasında hala labelVisibilityMode bulunamadı mesajını alabilirsiniz . Durum buysa, en azından tasarım destek kitaplığının 28.0.0-alpha1 sürümüne bağlı olan verilen bağımlılığın bir sürümüne yükseltmeyi deneyin. Bu mümkün değilse, bağımlılığı açıkça tanımlayın.
Gradle kullanıyorsanız
Build.gradle dosyanıza açıkça tasarım desteği bağımlılığı eklemek için :
uygulama 'com.android.support:design:28.0.0'
Varsayılanı kullanarak güncellenmiş cevap için. En son tasarım kitaplığına güncelleme
uygulama "com.android.support:design:28.0.0"
ve BottomNavigationView xml özniteliklerinizi ekleyin
app:itemHorizontalTranslationEnabled="false"
bunu programlı olarak da koyabilirsiniz
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
Kaynağı burada bulabilirsiniz BottomNavigationView
Umarım bu size yardımcı olur.
app:labelVisibilityMode
?
Senin BottomNavigationView
eklemek içinapp: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>
aşağıdakilere neden olur
Çok basit, BottomNaviationView'a bir özellik eklemeniz yeterli
app:labelVisibilityMode="unlabeled"
BottomNavigationView ile bazı garip davranışlar yaşadım. İçinde herhangi bir öğeyi / parçayı seçtiğimde, parça BottomNavigationView'ı biraz daha aşağıya iter, böylece BottomNavigationView metni ekranın altına gider, böylece herhangi bir öğeye tıklandığında yalnızca simgeler görünür ve metin gizlenir.
Bu tuhaf davranışla karşı karşıyaysanız, işte çözüm. Sadece kaldır
android:fitsSystemWindows="true"
kök parça düzeninizde. Sadece bunu kaldır ve bum! BottomNavigationView iyi çalışacak, şimdi metin ve simge ile gösterilebilir. Bunu, kök Koordinatörümde parça düzeni vardı.
Ayrıca eklemeyi unutmayın
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
etkinliğinizde vites değiştirme modunu devre dışı bırakmak için. Sorulan soruyla tam olarak ilgili olmasa da yine de bunu yararlı buluyorum.
Bu kullandığım üçüncü taraf bir kitaplıktır ve vardiya modunu devre dışı bırakmak, yalnızca simgeleri göstermek, simge boyutunu ayarlamak vb. Gibi birçok özelleştirme seçeneğine sahiptir. BottomNavigationViewEx
Ayrıca o sinir bozucu küçük üst marj animasyonundan kurtulmak istiyorsanız, daha fazla yansıtma koduna ihtiyacınız var. İşte herhangi bir animasyonu kaldıran eksiksiz çözüm:
@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");
}
}
Ve bunu proguard yapılandırma dosyanıza eklediğinizden emin olun:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
destek kitaplığınızı 28.0.0'a güncelleyin.
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
Support: design: 28.0.0 kullanıyorsanız bu satırı app: labelVisibilityMode = "unlabeled" BottomNavigationView'a ekleyin
sadece bunu bu yöntemin üzerine eklemek istiyorum disableShiftMode da aşağıdaki kodu ekleyin. @SuppressLint ("RestrictedApi")
https://android.jlelse.eu/disable-shift-label-animation-from-bottom-navigation-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>
Geliştirmek için Android Studio 4.0.1 kullanıyorum. Aşağıdaki sonuç benim sonucum ...
BottomNavigationViewHelper.java hakkında Kodum burada çalışıyor
import com.google.android.material.bottomnavigation.BottomNavigationItemView;
import com.google.android.material.bottomnavigation.BottomNavigationMenuView;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomnavigation.LabelVisibilityMode;
import android.annotation.SuppressLint;
import android.util.Log;
import java.lang.reflect.Field;
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void disableShiftMode(BottomNavigationView view) {
view.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
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.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());
}
} 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);
}
}
}
Sonra BottomNavigationViewHelper sınıfını kullanmaya başlayabiliriz Ve bu benim MainActivity.java için kodum.
BottomNavigationView navView = findViewById (R.id.nav_view); BottomNavigationViewHelper.disableShiftMode (navView);
import android.os.Bundle;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
BottomNavigationViewHelper.disableShiftMode(navView);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_settings,
R.id.navigation_connection,
R.id.navigation_status,
R.id.navigation_report,
R.id.navigation_profile
).build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
getSupportActionBar().hide();
}
}
Bunu BottomNevigationView'da 3 ila 5 öğe için hem metni hem de simgeleri göstermek ve kaydırmayı durdurmak için kullanabilirsiniz.
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....