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);
}
}
}
}
结果:
我正在开发一个 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);
}
}
}
}
结果: