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表示actionview控件,点击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
原创粉丝点击