BottomNavigationView ไม่แสดงชื่อเมนูที่ไม่ได้ใช้งาน
จะแสดงชื่อขององค์ประกอบเมนูทั้งหมดใน bottomNavigationBar ได้อย่างไร? ปัญหาคือว่าในกรณีของฉันแสดงเฉพาะชื่อขององค์ประกอบที่คลิก
BottomNavigationView ไม่แสดงชื่อเมนูที่ไม่ได้ใช้งาน
จะแสดงชื่อขององค์ประกอบเมนูทั้งหมดใน bottomNavigationBar ได้อย่างไร? ปัญหาคือว่าในกรณีของฉันแสดงเฉพาะชื่อขององค์ประกอบที่คลิก
คำตอบ:
การนำไปใช้งานแบบBottomNavigationView
มีเงื่อนไข: เมื่อมีมากกว่า 3 รายการจากนั้นใช้โหมด shift
ในขณะนี้คุณไม่สามารถเปลี่ยนผ่าน API ที่มีอยู่ได้และวิธีเดียวที่จะปิดใช้งานโหมด shift คือใช้การสะท้อนกลับ
คุณจะต้องเรียนผู้ช่วย:
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);
}
}
}
และจากนั้นใช้disableShiftMode
วิธีการของคุณBottomNavigationView
แต่จำไว้ว่าถ้าคุณกำลังขยายมุมมองเมนูจากรหัสของคุณคุณจะต้องดำเนินการได้หลังจากพองตัว
ตัวอย่างการใช้งาน:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
PS
BottomNavigationView
โปรดจำไว้ว่าคุณจะต้องดำเนินการวิธีการนี้ในแต่ละครั้งที่คุณเปลี่ยนรายการเมนูในของคุณ
UPDATE
คุณต้องอัปเดตไฟล์กำหนดค่า proguard (เช่น proguard-rules.pro) โค้ดด้านบนใช้การสะท้อนภาพและจะไม่ทำงานหาก proguard ทำให้mShiftingMode
ฟิลด์สับสน
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
ขอบคุณมูฮัมหมัด Alfaifi สำหรับการชี้ปัญหานี้และให้ข้อมูลโค้ด
อัพเดท 2
ดังที่โยลันดาเวอโฮฟชี้ให้เห็นห้องสมุดสนับสนุนใหม่ ( 28.0.0-alpha1
) และไลบรารีวัสดุส่วนประกอบใหม่( 1.0.0-beta01
) เสนอคุณสมบัติสาธารณะซึ่งสามารถใช้เพื่อจัดการโหมดการเปลี่ยนผ่านรายการเมนู 3 รายการ
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
ในไลบรารีองค์ประกอบวัสดุจะมีผลหากมีรายการเมนู 5 รายการ
อัพเดท 3
ในฐานะที่เป็น @ThomasSunderland ยังได้ชี้ให้เห็นคุณสามารถตั้งค่าคุณสมบัตินี้เป็นเท็จapp:itemHorizontalTranslation="false"
โดยไม่ต้องมีEnabled
postfix เพื่อปิดใช้งานภาพเคลื่อนไหวแบบเลื่อน
คุณสามารถตรวจสอบคู่มือฉบับเต็มเพื่อจัดแต่งทรงก้นล่างได้ที่นี่
ตั้งแต่สนับสนุนไลบรารี28.0.0-alpha1:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
app:
ไม่ได้ใช้android:
หากต้องการปิดใช้งานภาพเคลื่อนไหวของข้อความคุณสามารถใช้สิ่งนี้ในไฟล์ dimens.xml ของคุณ:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
คุณอาจต้องเพิ่มสิ่งนี้ลงในรายการของคุณ:
tools:override="true"
tools:override="true"
<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
ตอนนี้คุณสามารถใช้app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
ใน28-alpha
labeled
จะทำให้มองเห็นป้ายกำกับทั้งหมดunlabeled
จะแสดงไอคอนเท่านั้นselected
จะแสดงเฉพาะป้ายกำกับสำหรับรายการที่เลือกและรายการเลื่อนauto
จะเลือกป้ายกำกับหรือเลือกตามจำนวนรายการที่คุณมี ติดป้ายกำกับสำหรับ 1-3 รายการและเลือกไว้ 3 รายการคำตอบของPrzemysławใน Kotlin เป็นฟังก์ชันส่วนขยาย
@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)
}
}
การใช้งาน (ด้วย Kotlin Android Extensions):
bottom_navigation_view.disableShiftMode()
ได้ผลสำหรับฉัน
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
หรือ
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
หากต้องการปิดใช้งานการเคลื่อนไหวของข้อความและลดขนาดตัวอักษรให้ใช้สิ่งนี้ในไฟล์ dimens.xml ของคุณ:
<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
จะเห็นว่าไม่มีวิธีอื่น ๆ
UPDATE
ใน Android sdk รุ่น 28 ขึ้นไปเปลี่ยนitem.setShiftingMode(false)
เป็นitem.setShifting(false)
พวกเขายังลบสนาม mShiftingMode
ดังนั้นการใช้งานจะเป็น
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());
}
}
}
ดังที่คนอื่น ๆ ชี้เนื่องจากห้องสมุดสนับสนุน 28.0.0-alpha1เป็นไปได้:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
หรือคุณสามารถตั้งค่าprogramatically
หมายเหตุ: หากคุณกำลังอัพเกรดจากไลบรารีการสนับสนุนรุ่นเก่าอย่าลืมยกระดับ SDK คอมไพล์ ตรวจสอบเวอร์ชั่นของ libraray ที่นี่: Support Library เวอร์ชั่น
อย่างไรก็ตามคุณยังอาจได้รับข้อความlabelVisibilityMode ไม่พบเมื่อรวบรวมหากแอปของคุณขึ้นอยู่กับไลบรารีสนับสนุนการออกแบบรุ่นเก่า หากเป็นกรณีนี้ให้ลองอัปเกรดเป็นรุ่นของการอ้างอิงที่กำหนดซึ่งขึ้นอยู่กับรุ่นของไลบรารีการสนับสนุนการออกแบบอย่างน้อย 28.0.0-alpha1 หากไม่สามารถทำได้ให้กำหนดการพึ่งพาอย่างชัดเจน
ถ้าคุณใช้ Gradle
ในการเพิ่มการสนับสนุนการออกแบบอย่างชัดเจนในbuild.gradleของคุณ:
การใช้งาน 'com.android.support:design:28.0.0'
สำหรับคำตอบที่อัพเดตโดยใช้ค่าเริ่มต้น อัปเดตเป็นห้องสมุดออกแบบล่าสุด
การใช้งาน "com.android.support:design:28.0.0"
และใส่ลงในแอตทริบิวต์ BottomNavigationView xml ของคุณ
app:itemHorizontalTranslationEnabled="false"
คุณสามารถวางไว้เป็นโปรแกรม
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
คุณสามารถค้นหาแหล่งที่มาที่นี่BottomNavigationView
หวังว่านี่จะช่วยคุณได้
app:labelVisibilityMode
อะไร
เพื่อBottomNavigationView
เพิ่มของคุณapp: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>
ซึ่งส่งผลในการดังต่อไปนี้
มันง่ายมากเพียงแค่เพิ่มคุณสมบัติใน BottomNaviationView
app:labelVisibilityMode="unlabeled"
ฉันมีพฤติกรรมแปลก ๆ กับ BottomNavigationView เมื่อฉันเลือกรายการ / ชิ้นส่วนใด ๆ ชิ้นส่วนจะกด BottomNavigationView ต่ำกว่าดังนั้นข้อความของ BottomNavigationView จะอยู่ด้านล่างหน้าจอดังนั้นไอคอนเท่านั้นที่มองเห็นได้และไอคอนจะปรากฏเฉพาะเมื่อคลิกรายการใด ๆ
หากคุณกำลังเผชิญกับพฤติกรรมแปลก ๆ นั่นก็คือทางออก เพียงลบ
android:fitsSystemWindows="true"
ในรูปแบบรูทของชิ้นส่วน เพียงแค่ลบสิ่งนี้และความเจริญ! BottomNavigationView จะทำงานได้ดีตอนนี้สามารถแสดงพร้อมข้อความและไอคอนได้ ฉันมีสิ่งนี้ในรูทผู้ประสานงานของฉันออกจากส่วน
นอกจากนี้อย่าลืมเพิ่ม
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
ในกิจกรรมของคุณเพื่อปิดใช้งานโหมดการเปลี่ยน แม้ว่ามันจะไม่เกี่ยวข้องกับคำถามที่ถาม แต่ก็ยังพบว่ามีประโยชน์
นี่คือห้องสมุดบุคคลที่สามที่ฉันใช้และมีตัวเลือกการปรับแต่งมากมายเช่นปิดใช้งานโหมดกะแสดงเฉพาะไอคอนขนาดไอคอนการตั้งค่า ฯลฯ BottomNavigationViewEx
หากคุณต้องการกำจัดภาพเคลื่อนไหวบนขอบเล็กน้อยที่น่ารำคาญคุณต้องใช้รหัสการสะท้อนเพิ่มเติม นี่คือโซลูชันที่สมบูรณ์ที่จะลบภาพเคลื่อนไหวออก:
@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");
}
}
และตรวจสอบให้แน่ใจว่าเพิ่มไฟล์นั้นลงในไฟล์กำหนดค่า proguard ของคุณ:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
อัปเดตห้องสมุดสนับสนุนของคุณเป็น 28.0.0
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
หากคุณใช้การสนับสนุน: การออกแบบ: 28.0.0 เพิ่มแอพพลิเคชั่นนี้: labelVisibilityMode = "unlabeled" ใน BottomNavigationView ของคุณ
เพียงแค่ต้องการที่จะเพิ่มที่ด้านบนวิธีนี้ปิดการใช้งาน ShiftMode เพิ่มรหัสด้านล่างเกินไป @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>
คุณสามารถใช้สิ่งนี้เพื่อแสดงข้อความและไอคอนบน BottomNevigationView สำหรับรายการ 3 ถึง 5 และหยุดการขยับ
app:labelVisibilityMode="labeled"
แต่คุณจะประสบปัญหาการตัดข้อความยาวบน BottmNevigationView สำหรับ 5 รายการ เพื่อที่ฉันได้พบทางออกที่ดีสำหรับหยุดการขยับของข้อความเช่นเดียวกับไอคอนของ BottomNevigationView นอกจากนี้คุณยังสามารถหยุดการเลื่อนของข้อความและไอคอนบน BottomNevigationView ด้วย มีการให้สแนปชอตของรหัสที่นี่
1. เพิ่มโค้ดบางบรรทัดใน BottomNevigationView ตามที่แสดง
<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. เพิ่มรายการเมนูดังนี้: -
<?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. เพิ่มสไตล์นี้ในไฟล์ 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) เพิ่มรายการเหล่านี้ในโฟลเดอร์ 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>
ผมได้รับความช่วยเหลือจากเหล่านี้ เชื่อมโยงและการเชื่อมโยงนอกจากนี้คุณยังจะได้รับได้รับความช่วยเหลือโดยการศึกษา links.This เหล่านี้ช่วยให้ผม lot.Hope นี้ยังช่วยให้คุณ ขอบคุณ ....