Android新特性-ToolBar小结

来源:互联网 发布:2017淘宝双11销量排名 编辑:程序博客网 时间:2024/05/16 10:29

要引入Toolbar需要将ActionBar进行隐藏,你可以继承主题NoActionBar,也可以通过设置:

<item name="windowActionBar">false</item>        <item name="windowNoTitle">true</item>

Toolbar创建:

    <android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="?actionBarSize"        android:background="@color/colorAccent"        app:popupTheme="@style/popupTheme"        app:theme="@style/Theme.Toolbar">

1>app:popupTheme设置Menu的主题样式。

    <style name="popupTheme" parent="Theme.AppCompat.Light.DarkActionBar">        <item name="android:textSize">25sp</item>        <item name="android:textColor">#FF0000</item>    </style>

在java文件中为Toolbar添加控件:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);        toolbar.setLogo(R.mipmap.ic_launcher);        toolbar.setTitle("Title");        toolbar.setTitleTextColor(getResources().getColor(R.color.colorPrimaryDark));        //toolbar.setTitleTextAppearance(this,);//更改Title文字的样式:文字的大小、颜色        toolbar.setSubtitle("SubTitle");        toolbar.setSubtitleTextColor(getResources().getColor(R.color.colorPrimaryDark));        //toolbar.setTitleTextAppearance(this,R.style.Base_Theme_Title);        toolbar.inflateMenu(R.menu.main);//为toolbar填充menu        //为导航设置监听点击事件        toolbar.setNavigationOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(ToolBarActivity.this, "you click navigation", Toast.LENGTH_SHORT).show();            }        });        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {            @Override            public boolean onMenuItemClick(MenuItem item) {                switch (item.getItemId()) {                    case R.id.main_item1:                        Toast.makeText(ToolBarActivity.this, "you click item1", Toast.LENGTH_SHORT).show();                        break;                    case R.id.main_item2:                        Toast.makeText(ToolBarActivity.this, "you click item2", Toast.LENGTH_SHORT).show();                        break;                    case R.id.main_item3:                        Toast.makeText(ToolBarActivity.this, "you click item3", Toast.LENGTH_SHORT).show();                        break;                    case R.id.main_item4:                        Toast.makeText(ToolBarActivity.this, "you click item4", Toast.LENGTH_SHORT).show();                        break;                }                return true;            }        });
效果如下:

2>app:theme="@style/Theme.Toolbar"设置toolbar的主题样式,此属性可修改元素以及任何子元素的主题,有助于改变界面中特定部分的主题配色工具,在这里是设置Toolbar的overflow的图片:

    <style name="Theme.Toolbar" parent="Theme.AppCompat.Light.NoActionBar">        <item name="actionOverflowButtonStyle">@style/actionOverflowStyle</item>    </style>    <style name="actionOverflowStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow">        <item name="android:src">@mipmap/ic_menu_more_overflow</item>    </style>

效果:


上下文操作模式(ActionMode):

它将用户交互的重点转到执行上下文操作上。用户通过选择项目启动此模式时,屏幕顶部将出现一个“上下文操作栏”,显示用户可对当前所选项执行的操作。启动此模式后,用户可以选择多个项目(若你允许)、取消选择项目以及继续在Activity内导航(在您语序的最大范围内)。当用户取消选择所有项目,按返回按钮或者选择操作栏左侧的完成操作时,该操作模式将会金庸,且上下文操作栏将会消失。

注:上下文操作栏不一定与操作栏相关联。尽管看来上下文操作栏取代了操作栏的位置,但事实上二者独立运行。

如果你的应用是针对Android3.0(API11)或者更高版本的系统开发,则通常应使用上下文操作模式显示上下文操作。

应用如何调用上下文操作模式以及如何定义,每个操作的行为,具体取决于你的设计。设计基本上分为两种:

1、针对单个任意视图的上下文操作

2、针对ListView或者GridView或项目组的批处理上下文操作(允许用户选择多个项目并针对所有项目执行操作)

针对单个任意视图的上下文操作模式步骤:

1、实现ActionMode.Callback接口。在其回调方法中,您既可以为上下文操作栏指定操作,又可以相应操作项目的点击事件,还可以处理操作模式的其他生命周期事件.

2、当需要显示操作栏时(例如:用户长按视图),调用startActionMode()

改变整个标题栏:

startActionMode(new ActionMode.Callback() {            /**             * 当ActionMode第一次被创建,参数中的Menu将会被用来生成ActionButton为这个ActionMode             * 返回true这个ActionMode将被创建,返回false将不会被创建             */            @Override            public boolean onCreateActionMode(ActionMode mode, Menu menu) {                mode.getMenuInflater().inflate(R.menu.main2, menu);//创建ActionMode                return true;            }            /**             * 当ActionMode的Menu进行刷新的时候被调用 mode.invalidate();             * 返回true Menu或ActionMode被刷新  否则返回false             */            @Override            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {                return true;            }            /**             * 当用户点击了Action Button的时候调用             * 返回true 则这个回调处理这个事件,返回false 这个标准MenuItem继续调用             */            @Override            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {                mode.finish();//当点击其中的一个按钮则释放ActionMode                return false;            }            /**             * 当ActionMode退出和销毁的时候调用             */            @Override            public void onDestroyActionMode(ActionMode mode) {            }        });

如果想兼容Android3.0以前的版本则调用startSupportActionMode方法,要想让ActionMode在ToolBar之上则在主题加上:

<item name="windowActionModeOverlay">true</item>

设置ActionMode的样式:

<!-- 设置ActionMode的背景-->        <item name="actionModeBackground">@color/colorAccent</item>        <!-- 点击释放ActionMode的图片-->        <item name="actionModeCloseDrawable">@mipmap/ic_menu_delete</item>
效果:

如果只是改变ToolBar其中一个子View,则

view = LayoutInflater.from(this).inflate(R.layout.hide_layout,null);        view.findViewById(R.id.hide_layout_iv).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                changeMenuItem.setActionView(null);            }        });        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {            @Override            public boolean onMenuItemClick(MenuItem item) {                switch (item.getItemId()){                    case R.id.main_item1:                        changeMenuItem = item;                        item.setActionView(view);//将view替换menuItem                        break;                }                return true;            }        });
效果:

常见的是EditText,默认选中文字会出现如下效果:


为EditText设置ActionMode:

et.setCustomSelectionActionModeCallback(new ActionMode.Callback() {            @Override            public boolean onCreateActionMode(ActionMode mode, Menu menu) {                //如果你想取消掉EditText默认显示某几个功能                menu.removeItem(android.R.id.cut);//取消剪切功能                menu.removeItem(android.R.id.copy);//取消掉复制功能                menu.removeItem(android.R.id.selectAll);//取消掉全选功能                menu.removeItem(android.R.id.edit);//取消掉编辑功能                return true;//默认显示系统默认的menu            }            @Override            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {                return false;            }            @Override            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {                return false;//继续让标准控件来处理这个事件            }            @Override            public void onDestroyActionMode(ActionMode mode) {            }        });

效果如下:


ListView或者GridView或项目组的批处理上下文操作

1、实现AbsListView.MultiChoiceModeListener接口,并使用setMultiChoiceModeListener()为视图组设置该接口。在侦听器的回调方法中,您既可以为上下文操作栏指定操作,也可以相应操作项目的点击事件,还可以处理从ActionMode.Callback接口继承的其他回调.

2、为setChoiceMode设置CHOICE_MODE_MULTIPLE_MODAL

for(int i = 0 ; i < strs.length ; i++){            strs[i] = "Andly Item"+i;        }        ArrayAdapter aa = new ArrayAdapter(this,android.R.layout.simple_list_item_1,strs);        lv = (ListView) findViewById(R.id.lv);        lv.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);        lv.setAdapter(aa);        lv.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {            @Override            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {                //当用户选中或取消选中的时候调用,如可以更新Title                String checkStr = strs[position];                mode.setTitle(checkStr);            }            @Override            public boolean onCreateActionMode(ActionMode mode, Menu menu) {                //开始创建Mode                mode.getMenuInflater().inflate(R.menu.main2, menu);                return true;            }            @Override            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {                return false;            }            @Override            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {                switch (item.getItemId()) {                    case R.id.main2_item1:                        Toast.makeText(ToolBarMultiChoiceActivity.this, "you click search", Toast.LENGTH_SHORT).show();                        mode.finish();//将ActionMod取消                        break;                }                return true;            }            @Override            public void onDestroyActionMode(ActionMode mode) {                mode = null;            }        });
效果:


在某些情况下,如果上下文操作提供常用的操作项目,则你可能需要添加一个复选框或类似的UI元素来支持用户选择项目,这是因为他们可能没有发现长按行为用户选中该复选框时,你可以通过使用setItemChecked()将相应的列表项设置为选中状态,以此调用上下文操作模式。



0 0
原创粉丝点击