本文来自网易云社区

作者:孙圣翔

添加ActionProvider

1.在menu菜单中添加app:actionProviderClass属性:

<item   
 android:id="@+id/plus"  
   android:icon="@drawable/actionbar_plus_icon_normal"  
     android:title="@string/more"    
     app:actionProviderClass="android.support.v7.widget.ShareActionProvider"   
      app:showAsAction="always">
</item>
// 注意 根据是否引用的support包,actionProviderClass设置的类不同,如果是support包则设置为android.support.v7.widget.ShareActionProvider且用app来标识, 否则设置为android.widget.ShareActionProvider且用android来标识

2. 在代码中设置

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_menu, menu);
    MenuItem plus = menu.findItem(R.id.plus);  
      //support包中采用如下方法
    //MenuItemCompat.setActionProvider(plus, new ShareActionProvider(this));
    //非support中直接设置
    //plus.setActionProvider(new ShareActionProvider(this));     //support包中采用如下方法
    ShareActionProvider provider = (ShareActionProvider) MenuItemCompat.getActionProvider(plus);
    provider.setShareIntent(getShareIntent());    
    //ShareActionProvider provider = plus.getActionProvider();
    return true;
}private Intent getShareIntent() {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");    
    return intent;
}

上述就实现了分享的效果,只是需要注意的是要区分所引用的类是否是support包中的类。类型一定要正确。

自定义provider

如果系统提供的provider不符合要求怎么办?我们还可以自定义provider。

public class PlusProvider extends ActionProvider {  
  /**
     * Creates a new instance. ActionProvider classes should always implement a
     * constructor that takes a single Context parameter for inflating from menu XML.
     *
     * @param context Context for accessing resources.
     */
    public PlusProvider(Context context) {     
       super(context);
    }    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        subMenu.clear();
        subMenu.add("tab1").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {          
          @Override
            public boolean onMenuItemClick(MenuItem item) {         
                   return false;
            }
        });
        subMenu.add("tab2").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {          
          @Override
            public boolean onMenuItemClick(MenuItem item) {           
                 return false;
            }
        });
    }    
    @Override
    public View onCreateActionView() {    
        return null;
    }   
     @Override
    public boolean hasSubMenu() {      
      return true;
    }
}

上面我们自定义了一个加号的provider,hasSubMenu表示十分有子菜单,true表示有,在onPrepareSubMenu中初始化子菜单。子菜单可以设置显示文字,图标与响应点击事件。

设置完成后,就与系统提供的provider使用方式一样。

设置ActionLayout

设置ActionLayout可以用自定义的布局来展示菜单图标。

1.创建一个布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="right"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.netease.study.ui.title.ActionBarActivity">     <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/actionbar_setting_icon"/></RelativeLayout>

布局中包含了一个设置图标,之后在menu中引用

<item    
android:id="@+id/plus"   
 android:icon="@drawable/actionbar_plus_icon_normal" 
    android:title="@string/more"   
     app:actionLayout="@layout/action_layout"  
      app:showAsAction="always">
</item>

这样就把默认的加号图标给改变成设置图标,在代码中也可以调用setActionView来更改图标。但是不建议这样做,每一个菜单都做明确的事情。

页面导航

怎么开启页面导航?在代码中调用getActionBar(). setDisplayHomeAsUpEnabled(true)就可以开启页面导航,如果是support包中需要调用getSupportActionBar(),开启后,默认页面左上角会出现返回箭头。指示页面点击可以返回。仅仅是开启页面导航是不够的,还需要对他进行处理。

因为返回箭头也属于ActionBar中的ActionView因此处理方式是一样的,不同是的它的id已经默认指定为android.R.id.home。因此需要在onOptionsItemSelected函数中处理id为android.R.id.home:

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {   
 switch (item.getItemId()) {       
  case android.R.id.home:
            finish();         
               break;
    }   
     return super.onOptionsItemSelected(item);
}

左上的箭头图标,我们可以在style中设置为自己的图标,也可以在代码中调用getActionBar().setHomeAsUpIndicator()来更改图标。

一般情况下只需要关闭掉当前界面,因此直接调用finish关闭掉当前页面。但是这不是返回箭头设置的初衷,否则他与软件的返回没有任何的区别,那在什么情况下需要特殊处理呐?

这里有一个邮件列表页面,点击其中一项,打开邮件详情,在邮件详情页可以左右导航到上一封或者下一封邮件,这样在点击左上箭头事希望能回到列表页,而软键盘返回则返回上一个页面。这种情况怎么处理?

1.首先需要在AndroidManifest页面中对Activity设置parent属性:

// 4.1版本之前<activity   
 android:name=".ActionBarActivity">
    <meta-data      
      android:name="android.support.PARENT_ACTIVITY"   
           android:value=".MainActivity">
    </meta-data>
</activity>// 4.1版本之后<activity   
 android:name=".ActionBarActivity"   
  android:parentActivityName=".MainActivity">
</activity>

2:在代码中处理对应的逻辑:

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {   
 switch (item.getItemId()) {        case android.R.id.home:
            Intent intent = NavUtils.getParentActivityIntent(this);      
                 if(intent!=null){
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                NavUtils.navigateUpTo(this, intent);
            }else{
                finish();
            }           
             break;
    }   
     return super.onOptionsItemSelected(item);
}

这样就可以直接放回到列表页,不在返回上一个界面,与返回键处理是不同的。

设置ActionMode

ActionMode是一种菜单,但是与其他菜单不一样的是,他占据的位置默认为ActionBar的位置,使用方式如下:

private void findViews() {
    View actionMode = findViewById(R.id.show_menu);  
      assert actionMode != null;
    actionMode.setOnLongClickListener(new View.OnLongClickListener() {    
        @Override
        public boolean onLongClick(View v) {
            ActionBarActivity.this.startActionMode(callback);        
                return true;
        }
    });
}private ActionMode.Callback callback = new ActionMode.Callback() {  
  @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.getMenuInflater().inflate(R.menu.action_menu1, menu);   
             return true;
    }   
     @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) {     }
};

我在对一个view进行长按的时候,出现ActionMode菜单。

Toolbar

如果Toolbar不当做ActionBar处理,Toolbar怎么进行设置与菜单显示?

private void setToolbar(Toolbar toolbar) {   
 //setSupportActionBar(toolbar);
    toolbar.setTitle("主标题");
    toolbar.setSubtitle("副标题");
    toolbar.setLogo(R.drawable.logo);
    toolbar.inflateMenu(R.menu.action_menu);
    toolbar.setOnMenuItemClickListener(new toolbar.OnMenuItemClickListener() {     
       @Override
        public boolean onMenuItemClick(MenuItem item) {           
         return false;
        }
    });
}

上面演示了当不做为ActionBar时,Toolbar怎么进行设置,主要是菜单的加载方式变化。Toolbar还可以与CollapsingToolbarLayout,AppBarLayout实现不一样的标题效果。

总结

这里主要是对ActionBar和Toolbar的使用进行了梳理,其实还有怎么对他们进行主题配置,这里就不在展开了。

Android标题栏(一)](http://blog.csdn.net/xueshanhaizi/article/details/52261960)

Android标题栏(二)](http://blog.csdn.net/xueshanhaizi/article/details/52263547)

网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 用供应链管理思路降低教培产品成本
【推荐】 Android Camera开发经验总结以及踩过的那些坑

Android 标题栏(2)的更多相关文章

  1. android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

    需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...

  2. android标题栏下面弹出提示框(一) TextView实现,带动画效果

    产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...

  3. Android标题栏上添加多个Menu按钮

    最近项目中碰到要在Android Menu旁边再添加一个按钮,而不是点击menu按钮然后在弹出一些选项. MainActivity代码: public class MainActivity exten ...

  4. Android 标题栏(1)

    本文来自网易云社区 作者:孙有军 标题栏在每个应用中都有,有各种各样的标题栏,今天我们就主要来说说标题栏怎么做,主要内容涉及到自定义标题,ActionBar,Toolbar等知识. 自定义标题 几年前 ...

  5. Android标题栏最右边添加按钮

    step1:重写activity的onCreateOptionsMenu方法 @Override public boolean onCreateOptionsMenu(Menu menu){ Menu ...

  6. Android 标题栏菜单设置与应用(popupWindow的应用)

    效果图

  7. android标题栏(titlebar)显示进度条

    在后台线程中执行各种操作(网络连接.大数据存储)的时候,我们希望让客户能看到后台有操作在进行,那么既能有效的提示用户,又不占用当前操作空间,最好的方法就是在标题栏有个进度条. [代码] [Java]代 ...

  8. Android 标题栏封装

    自定义命名空间与xml文件:

  9. Android开发之一些资源索引

    1.android标题栏(titlebar)显示进度条 protected void onCreate(Bundle savedInstanceState) { super.onCreate(save ...

随机推荐

  1. Redis集群批量操作

    Redis在3.0版正式引入了集群这个特性,扩展变得非常简单.然而当你开心的升级到3.0后,却发现有些很好用的功能现在工作不了了, 比如我们今天要聊的pipeline功能等批量操作. Redis集群是 ...

  2. ajax取到数据后如何拿到data.data中的属性值

    今天遇到的ajax取到数据后如何拿到data.data中的属性值的问题 比如拿到了数据 我要取出data中的name 题外话:当然取名最好别取什么奇怪的xiaobi

  3. javascript对象的学习

    一.对象的定义: 对象是JavaScript的一个基本数据类型,是一种复合值,它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值.即属性的无序集合. JavaScript 提供多个内建对 ...

  4. 使Win10用户获得特殊权限以便删除相应文件(夹)

    依次访问: 本地用户和组(右击“此电脑”): 用户: 右击:当前用户名: 属性: 添加: 输入:System Managed Accounts Group: 检查名称(可选): 确定: 重启电脑. 参 ...

  5. win10中使用win7/win8.1"个性化"

    直接下载使用: 点此下载 设置 Windows Registry Editor Version 5.00 ; ; Created by http://winaero.com, reedited by ...

  6. 有一个无效 SelectedValue,因为它不在项目列表中

    “Drp_XX”有一个无效 SelectedValue,因为它不在项目列表中 出现以上异常的原因肯定是将DrowDownList控件的SelectedValue属性赋值为一个列表中不存在的值.那么我们 ...

  7. SG函数入门&&HDU 1848

    SG函数 sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3. ...

  8. 使用CAShapeLayer实现复杂的View的遮罩效果

    一.案例演示 最近在整理一个聊天的项目的时候,发送图片的时候,会有一个三角的指向效果,指向这张图片的发送者.服务端返回给我们的图片只是一张矩形的图片,我们如何把一张矩形的图片或者View,加上一层自定 ...

  9. 【转】浅谈对主成分分析(PCA)算法的理解

    以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识.本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会. 主成分分析(PCA ...

  10. NOIP2016——大家一起实现の物语

    由于最近硬盘挂了,换了个固态硬盘,比赛结束后四天一直在装Linux,所以最近一直没怎么更新 看起来挺漂亮的 比赛前一个月申请停了一个月晚自习,在我们这座城市里能做到这种事情已经可以被称为奇迹了,并且在 ...