BottomNavigationView tidak menampilkan judul menu yang tidak aktif.
Bagaimana cara menunjukkan judul semua elemen menu di bottomNavigationBar? Masalahnya adalah bahwa dalam kasus saya hanya ditampilkan judul elemen yang diklik.
BottomNavigationView tidak menampilkan judul menu yang tidak aktif.
Bagaimana cara menunjukkan judul semua elemen menu di bottomNavigationBar? Masalahnya adalah bahwa dalam kasus saya hanya ditampilkan judul elemen yang diklik.
Jawaban:
Implementasi BottomNavigationView
memiliki kondisi: ketika ada lebih dari 3 item maka gunakan mode shift.
Pada saat ini Anda tidak dapat mengubahnya melalui API yang ada dan satu-satunya cara untuk menonaktifkan mode shift adalah dengan menggunakan refleksi.
Anda membutuhkan kelas pembantu:
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);
}
}
}
Dan kemudian menerapkan disableShiftMode
metode pada Anda BottomNavigationView
, tetapi ingat jika Anda menggembungkan tampilan menu dari kode Anda, Anda harus menjalankannya setelah menggembungkan.
Contoh penggunaan:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
PS.
Ingat, Anda harus menjalankan metode ini setiap kali Anda mengubah item menu di menu Anda BottomNavigationView
.
MEMPERBARUI
Anda juga perlu memperbarui file konfigurasi proguard (mis. Proguard-rules.pro), kode di atas menggunakan refleksi dan tidak akan berfungsi jika proguard mengaburkan mShiftingMode
bidang.
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
Terima kasih Muhammad Alfaifi untuk menunjukkan masalah ini dan memberikan cuplikan .
PEMBARUAN 2
Seperti yang Jolanda Verhoef tunjukkan perpustakaan Support baru ( 28.0.0-alpha1
) dan juga perpustakaan Material Components baru ( 1.0.0-beta01
) menawarkan properti publik yang dapat digunakan untuk memanipulasi mode pemindahan di atas 3 item menu.
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
Di pustaka Komponen Material itu juga berlaku jika ada 5 item menu.
PEMBARUAN 3
Seperti yang ditunjukkan oleh @ThomasSunderland, Anda dapat mengatur properti ini menjadi false app:itemHorizontalTranslation="false"
tanpa Enabled
postfix untuk menonaktifkan pemindahan animasi.
Anda dapat memeriksa panduan lengkap untuk menata Navigasi Bawah Laut di sini
Karena perpustakaan dukungan 28.0.0-alpha1:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
app:
tidakandroid:
Untuk menonaktifkan animasi teks, Anda juga dapat menggunakan ini di file dimens.xml Anda:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
Anda mungkin juga perlu menambahkan ini dalam manifes Anda:
tools:override="true"
tools:override="true"
<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
Anda sekarang dapat menggunakan app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
di28-alpha
labeled
akan membuat semua label terlihat.unlabeled
hanya akan menampilkan ikon.selected
hanya akan menampilkan label untuk item yang dipilih dan menggeser item.auto
akan memilih berlabel atau dipilih berdasarkan jumlah item yang Anda miliki. berlabel 1-3 item dan dipilih untuk 3+ item.Jawaban Przemysław di Kotlin sebagai fungsi ekstensi
@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)
}
}
Penggunaan (dengan Ekstensi Android Kotlin):
bottom_navigation_view.disableShiftMode()
Bekerja untukku
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
atau
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
Untuk menonaktifkan animasi teks dan mengurangi ukuran font gunakan ini di file dimens.xml Anda:
<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
untuk melihat bahwa tidak ada cara lain.
MEMPERBARUI
di Android SDK versi 28 dan di atas mereka telah berubah item.setShiftingMode(false)
menjadiitem.setShifting(false)
Mereka juga menghapus bidang mShiftingMode
Jadi penggunaannya akan
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());
}
}
}
Seperti yang orang lain tunjukkan, karena pustaka dukungan 28.0.0-alpha1 dimungkinkan:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
atau Anda dapat mengaturnya secara terprogram .
Catatan: jika Anda meningkatkan dari pustaka dukungan versi yang lebih lama, jangan lupa untuk meningkatkan kompilasi versi SDK. Periksa versi pustaka dukungan di sini: Versi Pustaka Dukungan
Namun, Anda mungkin masih mendapatkan labelVisibilityMode tidak ditemukan pesan saat dikompilasi, jika aplikasi Anda bergantung pada versi yang lebih lama dari perpustakaan dukungan desain. Jika ini masalahnya, cobalah untuk memutakhirkan ke versi ketergantungan yang diberikan, yang setidaknya tergantung pada versi 28.0.0-alpha1 dari perpustakaan dukungan desain. Jika itu tidak memungkinkan, tentukan ketergantungan secara eksplisit.
Jika Anda menggunakan Gradle
Untuk menambahkan ketergantungan dukungan desain secara eksplisit di build.gradle Anda :
implementasi 'com.android.support:design:28.0.0'
Untuk jawaban yang diperbarui menggunakan default. Perbarui ke perpustakaan desain terbaru
implementasi "com.android.support:design:28.0.0"
dan dimasukkan ke atribut xml BottomNavigationView Anda
app:itemHorizontalTranslationEnabled="false"
Anda dapat menempatkannya juga secara terprogram
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
Anda dapat menemukan sumber di sini BottomNavigationView
Semoga ini bisa membantu Anda.
app:labelVisibilityMode
?
Untuk BottomNavigationView
add Andaapp: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>
yang menghasilkan sebagai berikut
Ini sangat sederhana, Cukup tambahkan properti di BottomNaviationView
app:labelVisibilityMode="unlabeled"
Saya memiliki beberapa perilaku aneh dengan BottomNavigationView. Ketika saya memilih item / fragmen di dalamnya, fragmen mendorong BottomNavigationView sedikit lebih rendah, sehingga teks BottomNavigationView berada di bawah layar, jadi hanya ikon yang terlihat dan teks menjadi tersembunyi saat mengklik item apa pun.
Jika Anda menghadapi perilaku aneh itu di sini adalah solusinya. Hapus saja
android:fitsSystemWindows="true"
dalam tata letak akar fragmen Anda. Hapus ini dan booming! BottomNavigationView akan berfungsi dengan baik, sekarang dapat ditampilkan dengan teks dan ikon. Saya punya ini di root CoordinatorLayout of fragmen.
Juga jangan lupa untuk menambahkan
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
dalam aktivitas Anda untuk menonaktifkan mode pemindahan. Meskipun tidak persis terkait dengan pertanyaan yang diajukan, tetapi saya tetap merasa ini bermanfaat.
Ini adalah perpustakaan pihak ketiga yang saya gunakan dan memiliki banyak opsi penyesuaian seperti menonaktifkan mode shift, hanya menampilkan ikon, mengatur ukuran ikon, dll. BottomNavigationViewEx
Jika Anda juga ingin menghilangkan animasi margin atas yang sedikit mengganggu itu, Anda perlu lebih banyak kode refleksi. Inilah solusi lengkap yang menghilangkan animasi apa pun:
@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");
}
}
Dan pastikan untuk menambahkannya ke file konfigurasi proguard Anda:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
perbarui perpustakaan dukungan Anda ke 28.0.0.
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
Jika Anda menggunakan dukungan: desain: 28.0.0 tambahkan aplikasi baris ini: labelVisibilityMode = "tidak berlabel" ke BottomNavigationView Anda
hanya ingin menambahkan bahwa di atas metode ini disableShiftMode tambahkan kode di bawah ini juga. @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>
Anda dapat menggunakan ini untuk menampilkan teks dan ikon di BottomNevigationView untuk 3 hingga 5 item dan berhenti bergeser.
app:labelVisibilityMode="labeled"
Tetapi Anda akan menghadapi masalah pemotongan teks panjang di BottmNevigationView untuk 5 item. untuk itu, saya menemukan solusi yang baik untuk menghentikan pergeseran teks serta ikon BottomNevigationView. Anda juga dapat berhenti menggeser teks dan juga Ikon di BottomNevigationView. Cuplikan kode diberikan di sini.
1. Tambahkan ini beberapa baris kode di BottomNevigationView seperti yang ditunjukkan
<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. Tambahkan Item Menu seperti sebagai berikut: -
<?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. Tambahkan gaya ini dalam file 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) Tambahkan ini dalam folder 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>
Saya mendapat bantuan dari tautan dan tautan ini . Anda juga bisa mendapatkan bantuan dengan mempelajari tautan - tautan ini . Ini banyak membantu saya. Semoga ini juga membantu Anda. Terima kasih....