【发布时间】:2016-08-12 07:34:35
【问题描述】:
我的 DrawerLayout 有一个带有导航视图的应用程序。我以编程方式在菜单中添加项目,因为我通过网络接收信息。但有时,项目名称可能会很长,甚至会被截断,甚至带有椭圆形图标“...”
有人知道如何为我的菜单项设置多行吗?
谢谢
【问题讨论】:
标签: android navigation-drawer multiline
我的 DrawerLayout 有一个带有导航视图的应用程序。我以编程方式在菜单中添加项目,因为我通过网络接收信息。但有时,项目名称可能会很长,甚至会被截断,甚至带有椭圆形图标“...”
有人知道如何为我的菜单项设置多行吗?
谢谢
【问题讨论】:
标签: android navigation-drawer multiline
从 Android 支持设计库中重写 design_navigation_menu_item.xml 并修改您需要的东西(设置 android:ellipsize="end" 和 android:maxLines="2")
您的 res/layout/design_navigation_menu_item.xml 应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<CheckedTextView
android:id="@+id/design_menu_item_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:drawablePadding="@dimen/design_navigation_icon_padding"
android:gravity="center_vertical|start"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:ellipsize="end"
android:maxLines="2" />
<ViewStub
android:id="@+id/design_menu_item_action_area_stub"
android:inflatedId="@+id/design_menu_item_action_area"
android:layout="@layout/design_menu_item_action_area"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</merge>
但是,您应该只省略文本以正确遵循 Material Design 指南。
你不必重写任何东西来省略文本:
NavigationView
res/values/styles.xml
<style name="TextAppearance">
<item name="android:ellipsize">end</item>
</style>
res/layout/activity_main.xml
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer"
app:theme="@style/TextAppearance" />
【讨论】:
design_navigation_menu_item.xml 文件正在恢复到其原始版本。有人有解决方法吗? (顺便说一句,我已经尝试过离线构建应用程序,但徒劳无功)
我遇到了同样的问题,我试了又试,Menu 没有任何进展,我不是说这是不可能的,但我找不到打破MenuItem 行的方法。
但如果您不坚持使用Menu,我建议您在布局中使用ListView 或RecyclerView,如下所示:
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_draw_header">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_marginTop="160dp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.design.widget.NavigationView>
正如你所看到的,没有什么特别的东西要解释,没有菜单,只是一个RecyclerView,layout_marginTop 值与标题高度相同,我相信你知道故事的其余部分(如何启动RecyclerView),这种方法为NavigationView 菜单项(实际上是RecyclerView 项)提供了更大的灵活性。
如果我的回答不够清楚,请告诉我。
结果如下:
【讨论】:
你不应该改变它。
查看材料设计指南:https://material.io/design/components/navigation-drawer.html#anatomy
【讨论】:
只需在 NavigationView 标签上添加app:itemMaxLines="2" 属性,如下所示:
<com.google.android.mayerial.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer"
app:itemMaxLines="2" />
注意:材质依赖是--
implementation 'com.google.android.material.material:1.0.0'
【讨论】:
1.1.0,1.0.0材料库中没有这样的attr或方法
在 NavigationDrawer 中添加一个样式,将行数声明为“两”,如下所示:
<style name="NavigationDrawerStyle">
<item name="android:lines">2</item>
</style>
在你看来:
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@drawable/estilo"
android:fitsSystemWindows="true"
app:itemTextColor="@color/white"
app:theme="@style/NavigationDrawerStyle"
app:menu="@menu/activity_main_drawer" />
【讨论】:
向 NavigationDrawer 添加样式,然后在样式中包含 2 行。
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@drawable/estilo"
android:fitsSystemWindows="true"
app:itemTextColor="@color/white"
app:theme="@style/NavigationDrawerStyle"
app:menu="@menu/activity_main_drawer" />
<style name="NavigationDrawerStyle">
<item name="android:lines">2</item>
</style>
【讨论】: