Toolbar动态改变menu

阅读: 评论:0

Toolbar动态改变menu

Toolbar动态改变menu

关于Toolbar的使用网上有很多介绍了,这里不赘述了。

1.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>

这样我们可以控制标题的颜色和菜单的颜色,当然还有其他的标签…

2.动态改变menu

可能会有这样的需求,Toolbar有个确定的menu,选择条目时这个menu会显示当前选择数量,如:确定(3).

  • 1.不使用menu,在Toolbar中添加一个TextView控件

这种方式虽然也能实现,但是相当于只是把Toolbar当做一个ViewGroup使用了,我之前也是这样做的,哈哈哈

  • 2.在onPrepareOptionsMenu方法中控制

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();}

效果图:

  • 3.自定义ActionProvider方法自定义菜单

这种方式也可以动态改变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);
}

效果图:

第一种方式对于菜单显示样式有限制,一般情况可满足。第二种方式使用自己的布局,基本可以满足各种需要了。

3.Extra

添加子菜单

<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>
  • 2.Provider方式

重写onPrepareSubMenu和hasSubMenu方法,代码见上文,需要注意的是:

在onCreateActionView中返回自定义的菜单view时,onPrepareSubMenu是不会执行的,点击该菜单不会出现子菜单列表,因为只有返回null时onPrepareSubMenu才会调用。

当然,这种方式添加子菜单的方式太麻烦了,在xml文件里就可以搞定。

4.源码

本文发布于:2024-02-04 13:08:49,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170707980055857.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:动态   Toolbar   menu
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23