Android NavigationRail 显示项目文本的多个标签行

Android NavigationRail Show multiple label lines for item text

我正在开发一个 NavigationRail,我想用两行显示每个项目的文本,如这个官方示例所示,但最后它总是变得省略号。我试图重新定义应用样式,但似乎没有任何效果。

有什么帮助吗?提前致谢!

根据 Navigation rail - Material Design 文档,似乎没有官方方法可以为项目文本设置多行。但是您可以通过以下示例中的简单解决方法来实现此目的:

1。在xml中定义NavigationRailView,如下所示:

<com.google.android.material.navigationrail.NavigationRailView
    android:id="@+id/navigation_rail"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    app:labelVisibilityMode="labeled"
    app:menu="@menu/navigation_rail_menu"/>

其中 @menu/navigation_rail_menu 包含以下示例菜单项:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_item_all_files"
        android:enabled="true"
        android:icon="@android:drawable/ic_menu_gallery"
        android:title="All\nFiles" />
    <item
        android:id="@+id/menu_item_recent"
        android:enabled="true"
        android:icon="@android:drawable/ic_menu_slideshow"
        android:title="Recent\nFiles" />
    <item
        android:id="@+id/menu_item_all_pictures"
        android:enabled="true"
        android:icon="@android:drawable/ic_menu_gallery"
        android:title="All\nPictures" />
</menu>

2。对于每个项目,以编程方式更改最大行数,如下例所示:

//get the NavigationRailView
NavigationRailView navigationRailView = findViewById(R.id.navigation_rail);

//menu item 1
NavigationBarItemView item1 = navigationRailView.findViewById(R.id.menu_item_all_files);
BaselineLayout item1BaselineLayout = item1.findViewById(R.id.navigation_bar_item_labels_group);
setItemMaxLines(item1BaselineLayout, 2);

//menu item 2
NavigationBarItemView item2 = navigationRailView.findViewById(R.id.menu_item_recent);
BaselineLayout item2BaselineLayout = item2.findViewById(R.id.navigation_bar_item_labels_group);
setItemMaxLines(item2BaselineLayout, 2);

//menu item 3
NavigationBarItemView item3 = navigationRailView.findViewById(R.id.menu_item_all_pictures);
BaselineLayout item3BaselineLayout = item3.findViewById(R.id.navigation_bar_item_labels_group);
setItemMaxLines(item3BaselineLayout, 2);

其中 setItemMaxLines() 是一个辅助函数,用于为每个项目更改 MaxLines:

private void setItemMaxLines(BaselineLayout baselineLayout, int maxLines){
    if(baselineLayout!=null){
        for(int i=0; i<baselineLayout.getChildCount(); i++){
            View child = baselineLayout.getChildAt(i);
            if(child instanceof MaterialTextView){
                ((MaterialTextView)child).setMaxLines(maxLines);
                ((MaterialTextView)child).setGravity(Gravity.CENTER);
            }
        }
    }
} 

结果: