日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android menu分割线,给 NavigationView 的Menu的分割线 设置高度和颜色

發布時間:2025/3/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android menu分割线,给 NavigationView 的Menu的分割线 设置高度和颜色 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近遇到了一個問題,是給DrawerLayout的NavigationView的導航添加分割線,項目中的左側導航欄之前的實現是用系統Menu的方式來實現的,需求要給導航添加分割線,并且自定義顏色和高度,查看文檔雖然能通過給menu通過group加id的方式添加分割線 ,代碼如下:

android:id="@+id/group1"

android:checkableBehavior="single">

android:id="@+id/nav_camera"

android:icon="@drawable/ic_menu_camera"

android:title="Import" />

android:id="@+id/nav_gallery"

android:icon="@drawable/ic_menu_gallery"

android:title="Gallery" />

android:id="@+id/group2"

android:checkableBehavior="single">

android:id="@+id/nav_slideshow"

android:icon="@drawable/ic_menu_slideshow"

android:title="Slideshow" />

android:id="@+id/nav_manage"

android:icon="@drawable/ic_menu_manage"

android:title="Tools" />

android:id="@+id/nav_share"

android:icon="@drawable/ic_menu_share"

android:title="Share" />

android:id="@+id/nav_send"

android:icon="@drawable/ic_menu_send"

android:title="Send" />

顯示如下圖:

Paste_Image.png

但是設計不喜歡這個線條啊,很粗啊,顏色不好看啊!好吧改!不過在NavigationView上沒有找到可以訂制的屬性!然后查看NavigationView的源代碼,發現 左側欄的布局是通過NavigationMenuPresenter這個類來實現的,通過查看NavigationMenuPresenter的代碼發現了 design_navigation_item_separator.xml 這個布局:

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:layout_height="1dp"

android:background="?android:attr/listDivider"/>

發現顏色是可以通過在主題里通過listDivider屬性來配置,但是高度固定1dp了,View 沒有ID說明就沒有考慮這個高度,怎么改?

看看NavigationMenuPresenter的具體實現吧,左側欄整個布局是通過RecyclerView 來實現的,通過不同的 View 的 TYPE 類型來加載不同的布局!那么是不是可以從 RecyclerView 的 addOnChildAttachStateChangeListener 方法入手?

實踐出真知!

我們可以先通過反射得到RecyclerView:

Field fieldByPressenter = navigationView.getClass().getDeclaredField("mPresenter");

fieldByPressenter.setAccessible(true);

NavigationMenuPresenter menuPresenter = (NavigationMenuPresenter) fieldByPressenter.get(navigationView);

Field fieldByMenuView = menuPresenter.getClass().getDeclaredField("mMenuView");

fieldByMenuView.setAccessible(true);

final NavigationMenuView mMenuView = (NavigationMenuView) fieldByMenuView.get(menuPresenter);

mMenuView就是RecyclerView,剩下的是給其注冊addOnChildAttachStateChangeListener監聽,每加載一個view 就獲取它的ViewHolder,通過判斷ViewHolder是否是SeparatorViewHolder(是分割線的獨有ViewHolder)的實例,來確定分割線View,然后想怎么操作就怎么操作!完整代碼如下:

public static void setNavigationMenuLineStyle(NavigationView navigationView, @ColorInt final int color, final int height) {

try {

Field fieldByPressenter = navigationView.getClass().getDeclaredField("mPresenter");

fieldByPressenter.setAccessible(true);

NavigationMenuPresenter menuPresenter = (NavigationMenuPresenter) fieldByPressenter.get(navigationView);

Field fieldByMenuView = menuPresenter.getClass().getDeclaredField("mMenuView");

fieldByMenuView.setAccessible(true);

final NavigationMenuView mMenuView = (NavigationMenuView) fieldByMenuView.get(menuPresenter);

mMenuView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {

@Override

public void onChildViewAttachedToWindow(View view) {

RecyclerView.ViewHolder viewHolder = mMenuView.getChildViewHolder(view);

if (viewHolder != null && "SeparatorViewHolder".equals(viewHolder.getClass().getSimpleName()) && viewHolder.itemView != null) {

if (viewHolder.itemView instanceof FrameLayout) {

FrameLayout frameLayout = (FrameLayout) viewHolder.itemView;

View line = frameLayout.getChildAt(0);

line.setBackgroundColor(color);

line.getLayoutParams().height = height;

line.setLayoutParams(line.getLayoutParams());

}

}

}

@Override

public void onChildViewDetachedFromWindow(View view) {

}

});

} catch (Throwable e) {

e.printStackTrace();

}

}

效果圖如下:

Paste_Image.png

再來個更直觀的圖:

Paste_Image.png

總結

以上是生活随笔為你收集整理的android menu分割线,给 NavigationView 的Menu的分割线 设置高度和颜色的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。