需求是这样的,项目里用了 Android Support v7 的 Toolbar:
mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar);
这样就可以直接用 Toolbar 里面的 OverflowButton 作为 Meu 的扩展:
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }
现在需要对 OverflowButton 的弹出菜单做样式修改,已经修改的差不多了,发现弹出菜单的 minWidth 是定死的,由于菜单里的字比较少,弄一个很宽的菜单感觉很别扭. 一些代码 support v7 的源码:
android.support.v7.view.menu.MenuAdapter: public class MenuAdapter extends BaseAdapter { static final int ITEM_LAYOUT = R.layout.abc_popup_menu_item_layout; ..... }
这里的 R.layout.abc_popup_menu_item_layout 就是弹出的 popuwindow 里 Listview 的 item 的 layout
再看看具体布局:
<android.support.v7.view.menu.ListMenuItemView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?attr/dropdownListPreferredItemHeight" android:minWidth="196dip" style="@style/RtlOverlay.Widget.AppCompat.PopupMenuItem"> .........
这里竟然固定将 android:minWidth 固定设置成了 196dip
顿时一万头草泥马在心里路过....
刚开始想用反射的方式将 ITEM_LAYOUT 改变成其它的值,但是 static final 修饰的没办法修改
不到万不得以不想自己重写 OverflowButton 的逻辑,时间问题.
请问大家有什么好的方法,比如通过 android studio 编译器将这个资源文件替换掉之类的?
1 saberpowermo 2017-02-15 14:19:46 +08:00 我们 title 全都是自己写, 为的不是 自己写的比官方的好 就是因为怕碰见你这种情况。 |
![]() | 2 LancerXin OP @saberpowermo 之前也是自己写的,最近大改版成 Material Design 风格,我想着官方的应该比较好用吧,没想到还有扩展性这么差的控件... |
![]() | 3 michaelzhou 2017-02-15 14:37:15 +08:00 有个不是很优雅的办法,但至少能解决你的问题: 在那之前把那个 xml 直接给替换掉 Field field = MenuPopupHelper.class.getDeclaredField("ITEM_LAYOUT"); field.setAccessible(true); field.set(null, R.layout.custom_popup_menu_item_layout); |
![]() | 4 bjzhou1990 2017-02-15 14:38:29 +08:00 @LancerXin 官方很多控件扩展性都非常差,用官方的话加个 icon 会好看很多,也不需要自定义宽度了 |
![]() | 5 LancerXin OP @michaelzhou 这个方法我想过,你可以看看帖子后面几句话,ITEM_LAYOUT 的修饰是 final static int 用反射并不能修改这个值,如果是 final static Integer 或许可以,int 是基本类型,在 jvm 存储的地方是不同的. |
![]() | 自己写 PopupWIndow ? |
![]() | 8 banxi1988 2017-02-15 17:44:55 +08:00 MenuAdapter 不是公开的接口, 没什么扩展性,这没什么大问题. ```java /** * @hide */ @RestrictTo(LIBRARY_GROUP) public class MenuAdapter extends BaseAdapter { ``` |