本文来自网易云社区

作者:孙圣翔

添加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. JAVA分包下项目部分代码存储

    一.注册时姓名去重和符合汉字格式: // 新用户申请加入 public void NewHuman() { System.out.println("========新会员申请加入页面==== ...

  2. css3响应式表格

    <h1>极客学院相关课程</h1> <table class="responsive"> <thead> <tr> &l ...

  3. Java面向对象(接口、多态)

    面向对象 今日内容介绍 u 接口 u 多态 第1章 接口 1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的 ...

  4. JSTORM中IRichBolt与IBasicBolt的区别

  5. If you can't take it, don't dish it out.

    If you can't take it, don't dish it out.己所不欲,勿施于人.

  6. 微软打造了全球最大的Git代码库

    丹棱君有话说:今年 2 月,微软宣布将用 Git 管理 Windows 源代码.随后,Visual Studio 宣布开发 “Git 虚拟文件系统(GVFS)”,并将在终极项目和超大型团队中推行 Gi ...

  7. Python之邮件发送

    Python的smtplib提供了一种很方便的途径用来发送电子邮件,它有SMTP协议进行简单的封装,可以使用SMTP对象的sendmail方法发送邮件,通过help()查看SMTP所提供的方法如下: ...

  8. Linux下如何修改用户默认目录

      Linux下默认的用户目录一般为/home/xxx(root用户除外),有些时候我们可能需要修改这个目录,下面我就给大家分享2中修改的方法 工具/原料 Linux操作系统 方法/步骤 1 1.切换 ...

  9. Angularjs 列表页面筛选

    个人博客链接:http://blog.yangqiong.com.cn/angularjs-lie-biao-ye-mian-shai-xuan/ 需求:页面URL和查询结果保持一致,当筛选条件变化时 ...

  10. rhythmbox插件开发笔记3:安装 makefile && schema && po

    本篇主要讲通过makefile方式来安装rhythmbox插件的相关知识. makefile 如果makefile是什么,请自行谷歌 参考了pandasunny同学的rhythmbox-baidu-m ...