ToolBar(ActionBar)
来源:互联网 发布:python交易策略 编辑:程序博客网 时间:2024/06/02 13:10
ToolBar 是API21引入了为了替代系统自带的actionBar的控件,对于样式的设计更加灵活
用ToolBar替代系统默认的actionbar
- 1.ToolBar的引入,在res/layout/tool_bar.xml新建文件
<android.support.v7.widget.Toolbar android:id="@+id/toolBar" xmlns:android="http://schemas.android.com/apk/res/android"//所有系统自带的属性以Android为命名空间 android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"//设置为与系统自带的actionbar的高度相同 app:titleTextColor="@color/white"//toolbar的标题的颜色 android:background="@color/colorPrimary"//toolbar的背景颜色 android:theme="@style/ThemeOverlay.AppCompat.ActionBar"//toolbar应用主题 app:popupTheme="@style/ThemeOverlay.AppCompat.Light"//弹出的overflow菜单引用的主题 xmlns:app="http://schemas.android.com/apk/res-auto"/>//所有自定义(除了系统自带的,包括兼容包里面的)的属性都以app:为命名空间
- 2.用include关键字,将以上toolbar.xml引入activity的布局文件中
<include layout="@layout/tool_bar"/>
- 3.在代码中实例化toolbar并用它取代actionbar
/*activity应用的主题需要是NoActionBar的*/ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolBar = (Toolbar) findViewById(R.id.toolBar);//实例化布局中的toolbar setSupportActionBar(toolBar);//将toolbar设置为actionBar //后面toolbar的使用和actionbar的一样,通过getSupportActionBar可获得actionBar的对象,可以通过onCreateOptionMenu()和onOptionItemSelected()来设置toolbar的action和overflow菜单及相应事件
actionbar的使用
1.在res/menu/下新建xml文件 option_menu.xml
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" <!--每一个item就是actionBar中的一个action控件--> <item android:id="@+id/action_search" android:icon="@drawable/search" android:title="分享" app:showAsAction="collapseActionView|ifRoom " <!--showAsAction表示 是否作为action出现,其值可以做|运算(叠加) always:一直以action来显示, never:一直在overflow中显示 ifRoom:当actionbar控件足够时以action显示,控件不足时显示在overflow中, collapseActionView:视窗被折叠到一个action按钮中,当用户选择这个按钮时,操作 视窗展开。否则,这个操作视窗在默认的情况下是不可见的。一般要配合 ifRoom 一起使用才会有效果 actionViewClass表示action的view控件,点击action会跳出其view--> <!--表示每个 item 的优先级,值越大优先级越低, actionbar 地方不够就会放到 overflow 中。--> android:orderInCategory="1" android:actionViewClass="android.widget.SearchView"/> <item android:id="@+id/action_setting" android:title="设置" android:icon="@mipmap/setting" app:showAsAction="never"/></menu>
2.在代码中通过onCreateOptionMenu()方法将上述xml加载到actionbar中
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.option_menu, menu); return super.onCreateOptionsMenu(menu); }
- 如何修改overflow的图标
在style中通过重写覆盖原图标 <style name="AppthemeNoTitle" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorBlue</item> <item name="colorPrimaryDark">@color/colorBlueDark</item> <item name="android:actionOverflowButtonStyle">@style/OverflowStyle</item> </style> <style name="OverflowStyle"> <item name="android:src">@drawable/ic_mic_white_36dp</item> </style>
3.为actionBar中的action 设置监听事件
@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.action_favorite: //点击后的逻辑 return true; case R.id.action_search: //点击后的逻辑 return true; case R.id.action_share: //点击后的逻辑 return true; default: return super.onOptionsItemSelected(item); }
4.为actionBar 添加up 按钮,导航到该activity的parentActivity
修改up按钮图标,可以通过mToolbar.setNavigationIcon(R.drawable.ic_media_play);
1.在manifest中为activity定义parentActivity属性 <activity android:name=".SecondActivity" android:label="@string/secondActivity" android:parentActivityName=".MainActivity">//设置parentActivity该属性在API16才有 <meta-data//meta-data是为了兼容API16以下的版本 android:name="android.app.PARENT_ACTIVITY" android:value="com.excample.myapplication.MainActivity"/> </activity2.在activity的onCreate()方法中设置actionBar的向上返回功能 actionBar.setDisplayHomeAsUpEnabled(true);当点击up箭头时系统会自动调用他的返回parentActivity的方法在onOptionsItemSelected()方法中,所以在override这个方法需要super.onOptionsItemSelected()方法, (前提是parentActivity需在backstack中
5.动态更新OptionMenu 通过onPrepareOptionsMenu()方法
//onCreateOptionsMenu 只有在创建OPtionMenu时调用一次,当调用了invalidateOptionsMenu()方法后会再次调用该方法//onPrepareOptionsMenu onPrepareOptionsMenu是每次在display menu之前和每按一次Option按键都会调用一次,因此可以做OptionMenu的更新工作//menu.clear();此方法可以将menu中的item都删除//调用invalidateOptionsMenu()方法后,系统会再次依次调用onCreateOptionsMenu()和onPrepareOptionsMenu()方法覆盖onPrepareOptionsMenu(Menu menu)这个方法非常的好用,我们可以定义boolean值来进行判断,如果满足条件就可以把菜单栏动态设置成某些状态,比如是否可见,text值等等。
ActionBar中action有ActionView时的应用
以searchView为例
实现方法
1.在option_menu中添加item <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="search" app:showAsAction="ifRoom|collapseActionView"//作为action显示时让actionView处于折叠状态 app:actionViewClass="android.support.v7.widget.SearchView"/>//设定actionView 为兼容包的SearchView,注意:必须是【app:】非系统自带的属性才有效果
2.设置searchable信息配置文件:在res/xml下新建searchable.xml文件
3.为searchView设置查询结果显示的activity,在manifest中 <activity android:name=".SecondActivity" android:label="@string/title_activity_second1" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.SEARCH"/> //默认的查询开启隐式意图的action为searchManager.SEARCH与intent.action.SEARCH相等 </intent-filter> //定义searchable对象,并指明searchable配置文件的位置 <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity>
4.在代码中为searchView设置searchableinfo @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.option_menu, menu);//加载在xml中定义的OptionMenu MenuItem searchItem = menu.findItem(R.id.action_search);//实例化searchItem SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);//通过MenuItem实例化searchView SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);//得到searchManager对象 ComponentName cn = new ComponentName(this, SecondActivity.class);//得到处理search结果的activity的class全称 searchView.setSearchableInfo(searchManager.getSearchableInfo(cn));//为searchView设置searchableinfo 当search提交的时候,系统会根据searchableinfo的信息隐身开启设置的接受结果的activity,并传递查询的条件 return true; }
5.在查询结果activity中获得查询数据处理查询 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); handleQuery(getIntent());//当开启该activity通过新建实例时,通过getIntent()来获得开启的intent } @Override protected void onNewIntent(Intent intent) { handleQuery(intent);//当开启该activity不通过新建实例(如singleTop模式时),会调用onNewIntent传入再次开启的intent } private void handleQuery(Intent intent){ //判断开启这个实例的action是不是查询 if(Intent.ACTION_SEARCH==intent.getAction()){ //从intent中获取到用户输入的字符串 String query = intent.getStringExtra(SearchManager.QUERY); 。。。//处理查询的逻辑 } }
0 0
- ToolBar(ActionBar)
- Toolbar,ActionBar
- ActionBar and ToolBar
- 利用Toolbar替换ActionBar
- ActionBar和Toolbar
- ToolBar替代ActionBar
- Toolbar与Actionbar
- ActionBar 和 Toolbar详解
- toolbar 替代actionbar
- ActionBar/Toolbar定制ui
- ToolBar(5.0以后替代ActionBar)
- Android:Material系列:ActionBar-->Toolbar
- 修改Toolbar/Actionbar的图标
- Android:Material系列:ActionBar-->Toolbar
- Android toolbar与actionbar区别
- Android UI(ActionBar+Toolbar)详解
- 从ActionBar切换到toolBar
- 如何用Toolbar取代ActionBar
- hdu 1060
- crontab的使用
- LeetCode106 Construct Binary Tree from Inorder and Postorder Traversal
- http参数
- C#148课的主要内容
- ToolBar(ActionBar)
- LeetCode107 Binary Tree Level Order Traversal II
- 卡特兰数
- Python中的魔术方法
- JFreeChart(报表图形引擎)的使用
- LeetCode108 Convert Sorted Array to Binary Search Tree
- 使用wamp、thinkphp网站建设中的一些问题
- git 查看本地分支和远程分支,创建本地分支,创建远程分支,本地分支对应的远程分支相关联
- Unity3D自制虚拟摇杆和一个方法控制多个按钮