关于Toolbar的使用网上有很多介绍了,这里不赘述了。
一般使用系统的主题ThemeOverlay.AppCompat.Dark.ActionBar。也可以自定义主题:
<style name="ToolbarTheme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="titleTextColor">@color/colorAccent</item> <!--标题颜色-->
<item name="actionMenuTextColor">@color/white</item> <!-- 菜单颜色-->
</style>
这样我们可以控制标题的颜色和菜单的颜色,当然还有其他的标签…
可能会有这样的需求,Toolbar有个确定的menu,选择条目时这个menu会显示当前选择数量,如:确定(3).
这种方式虽然也能实现,但是相当于只是把Toolbar当做一个ViewGroup使用了,我之前也是这样做的,哈哈哈
onPrepareOptionsMenu这个方法在创建菜单时(onCreateOptionMenu)会调用一次.
比如我们现在就实现 “确定(3)”这种和动态设置显示和隐藏:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {Log.e(TAG, "onPrepareOptionsMenu");if(isSave){MenuItem save = menu.findItem(u_save);save.setVisible(true);String title = count == 0 ? "保存" : String.format("保存(%d)", count);save.setTitle(title);menu.findItem(u_share).setVisible(false);} else {menu.findItem(u_save).setVisible(false);MenuItem share = menu.findItem(u_share);share.setVisible(true);String title = count == 0 ? "分享" : String.format("分享(%d)", count);share.setTitle(title);}PrepareOptionsMenu(menu);
}
然后在数量改变的时候调用该方法?当然不是。系统提供给我们有两个方法可以间接调用该方法:
supportInvalidateOptionMenu()和invalidateOptionMenu()
如:
public void increase(View view) {count++;supportInvalidateOptionsMenu();}
效果图:
这种方式也可以动态改变menu,而且布局没有限制。
menu文件:通过actionProviderClass指定Provider
<itemandroid:actionLayout="@+id/menu_custom"android:title="自定义"android:id="@+id/menu_custom"app:actionProviderClass="lbar_menu.MainActionProvider"app:showAsAction="always"/>
菜单布局:background设置为actionBarItemBackground,这样点击时会有涟漪效果
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:background="?actionBarItemBackground"><TextViewandroid:id="@+id/tv_custom_menu"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="自定义"android:textColor="@color/white"/><Viewandroid:layout_width="match_parent"android:layout_marginTop="2dp"android:layout_height="1dp"android:background="@color/white"/></LinearLayout>
Provider类:提供了settext方法动态改变menu文本
public class MainActionProvider extends ActionProvider {LinearLayout customMenu;TextView tvTitle;View.OnClickListener clickListener;/*** Creates a new instance.** @param context Context for accessing resources.*/public MainActionProvider(Context context) {super(context);}@Overridepublic View onCreateActionView() {Log.e("toolbar-menu", "onCreateActionView");customMenu = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.layout_custom_menu, null);tvTitle = (TextView) customMenu.findViewById(R.id.tv_custom_menu);customMenu.setOnClickListener(clickListener);//return null 时才会调用onPrepareSubMenu方法
// return null;return customMenu;}@Overridepublic void onPrepareSubMenu(SubMenu subMenu) {subMenu.clear();subMenu.add("子菜单1").setIcon(R.mipmap.ic_launcher).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {return true;}});subMenu.add("子菜单2").setIcon(R.mipmap.ic_launcher).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {return true;}});}@Overridepublic boolean hasSubMenu() {return true;}public void setonClickListener(View.OnClickListener listener){clickListener = listener;}public void setTvTitle(String title){tvTitle.setText(title);}}
Activity中获取Provider:
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {Log.e(TAG, "onCreateOptionsMenu");getMenuInflater().u.share_and_save, menu);MenuItem customItem = menu.findItem(u_custom);MainActionProvider actionProvider = (MainActionProvider) ActionProvider(customItem);actionProvider.setonClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "自定义菜单", Toast.LENGTH_SHORT).show();}});CreateOptionsMenu(menu);
}
效果图:
第一种方式对于菜单显示样式有限制,一般情况可满足。第二种方式使用自己的布局,基本可以满足各种需要了。
<item android:id="@+id/action_more"android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"android:title="more"app:showAsAction="ifRoom"><menu><itemandroid:id="@+id/setting"android:title="设置" /><itemandroid:id="@+id/about"android:title="关于" /></menu>
</item>
重写onPrepareSubMenu和hasSubMenu方法,代码见上文,需要注意的是:
在onCreateActionView中返回自定义的菜单view时,onPrepareSubMenu是不会执行的,点击该菜单不会出现子菜单列表,因为只有返回null时onPrepareSubMenu才会调用。
当然,这种方式添加子菜单的方式太麻烦了,在xml文件里就可以搞定。
本文发布于:2024-02-04 13:08:49,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170707980055857.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |