ToolBar(ActionBar)

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"/>
        </activity


2.在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值