本文来自网易云社区

作者:孙圣翔

添加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);}    @Overridepublic void onPrepareSubMenu(SubMenu subMenu) {subMenu.clear();subMenu.add("tab1").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {          @Overridepublic boolean onMenuItemClick(MenuItem item) {         return false;}});subMenu.add("tab2").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {          @Overridepublic boolean onMenuItemClick(MenuItem item) {           return false;}});}    @Overridepublic View onCreateActionView() {    return null;}   @Overridepublic boolean hasSubMenu() {      return true;}
}

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

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

设置ActionLayout

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

1.创建一个布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns: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"><ImageViewandroid: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() {    @Overridepublic boolean onLongClick(View v) {ActionBarActivity.this.startActionMode(callback);        return true;}});
}private ActionMode.Callback callback = new ActionMode.Callback() {  @Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {mode.getMenuInflater().inflate(R.menu.action_menu1, menu);   return true;}   @Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {     return false;}   @Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {      return false;}   @Overridepublic 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() {     @Overridepublic 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中使用Protocol Buffers(中篇)
【推荐】 Android输入法弹出时覆盖输入框问题

转载于:https://www.cnblogs.com/163yun/p/9706449.html

Android 标题栏(2)相关推荐

  1. Android 标题栏(一)

    标题栏在每个应用中都有,有各种各样的标题栏,今天我们就主要来说说标题栏怎么做,主要内容涉及到自定义标题,ActionBar,Toolbar等知识. 自定义标题 几年前开发安卓是没有统一的标题的,每一个 ...

  2. android标题栏添加按钮_改善Android布局性能

    布局是 Android 应用中直接影响用户体验的关键部分.如果实现不当,您的布局可能会导致应用界面缓慢且需要占用大量内存.Android SDK 包含一些工具,有助于您识别布局性能方面的问题,将这些工 ...

  3. Android标题栏,状态栏

    自定义标题栏 getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1); 定义标题左边图标 get ...

  4. 自定义Android标题栏TitleBar布局

    很多网友发现自己Android程序的标题栏TitleBar区域很单调,如果想个性化一些可以通过下面的方法来为自己软件的标题定制一个 layout布局文件,比如浏览器的标题栏,它包含了网站的Favico ...

  5. android标题栏消失,安卓标题栏为什么没有显示

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用Eclipse开发的APP,其中一个Activit的标题栏没有显示,但没对Activity做过任何配置.由于不知道哪里出问题,下面把Activity的j ...

  6. android 标题栏进度圈使用方法,Android 自定义标题栏 显示网页加载进度的方法实例...

    这阵子在做Lephone的适配,测试组提交一个bug:标题栏的文字较长时没有显示完全,其实这并不能算个bug,并且这个问题在以前其他机器也没有出现,只是说在Lephone的这个平台上显示得不怎么美观, ...

  7. android标题栏上增加按钮,Android:向自定义标题栏添加按钮

    我创建了一个自定义标题栏,如本例所示 "一个自定义标题栏" – 一半下来. 在某些活动中,我想在标题栏的右侧放置一个按钮(与facebook app相同).我试图按如下方式向视图添 ...

  8. android标题栏添加按钮_几行代码实现Android通用标题栏(轻松向左右两侧添加Menu)...

    秦子帅明确目标,每天进步一点点..... 作者 |  丶E 地址 |  https://www.jianshu.com/p/8c15fc4114a7 前言 标题栏是app开发经常用到的东西,几乎每个页 ...

  9. android标题栏不被顶上去,Android仿微信QQ聊天顶起输入法不顶起标题栏的问题

    在这记录一下输入法弹出的一系列问题,有的输入法弹出就把整个布局弹上去,有的输入法弹出布局不会有变化,有的输入法弹出遮盖输入框等等问题,网上也有很多说加着加那的,但是看一下都不是很完整,解决不了所有问题 ...

最新文章

  1. python.freelycode.com-Python字节码介绍
  2. 统一认证服务CAS 5安装
  3. 一步一步SharePoint 2007之十四:实现Form认证(4)——创建管理帐户
  4. 新产品孕育记:PM如何把一款产品从0带到1
  5. JAVA WEB篇3——JSP
  6. php排序条件两个,php – 在两个条件下排序数组
  7. 技巧:使用User Control做HTML生成(转)
  8. Angular 4.x Template-Driven Forms
  9. 《剑指offer》之知识汇总
  10. 13.大容量存储结构(磁盘管理)
  11. 福建农村信用社计算机类C卷考什么,2015年福建省农村信用社公开招聘考试《计算机类》真题及详解...
  12. CloudFlare Workers 设置使用自定义域名
  13. ActiveMQ学习(二)——MQ的工作原理
  14. 刷固件让华硕Z87-K老主板支持nvme固态
  15. NYOJ有趣的问题(单源最短路径dijkstra)
  16. sparrow search algorithm(麻雀搜索算法)
  17. 四足论文《面对未知地形的四足机器人足端轨迹优化》解读
  18. qt 保存绘制图片时背景变黑_QGraphicsScene绘制背景图片引起的问题
  19. 构建AIDA-CoNLL数据集操作指南
  20. 卡联系人IccProvider

热门文章

  1. mybatis批量删除和插入
  2. RFID 打印机是什么
  3. 22年前,100万买入谷歌原始股,奥尼尔的股份如今市值多少?
  4. 我们行业有一个同行,他和身边所有的人都交好过,包括我
  5. 我弟弟用管理员身份把我和爸妈的WIFI设置了,现在就他能用网,气不过,有办法让我出口气吗?
  6. MATLAB产生线性等分量函数 linspace
  7. ssis 包配置组织程序_如何停止失控的SSIS程序包
  8. sql 自定义函数 示例_SQL滞后函数概述和示例
  9. sql 存储过程 并发测试_SQL单元测试模拟存储过程
  10. SQL Server实例的十大安全注意事项