这篇文章主要讲的是在低版本兼容的ActionBar中实现自定义的ActionProvider,ShareActionProvider的使用方法,如何实现分离式ActionBar,外加在分离式ActionBar上的ActionMode的效果。

一、自定义ActionProvider

建立一个类,继承android.support.v4.view.ActionProvider,然后复写里面的方法即可。主要就是初始化视图和相应点击事件。

范例一:

SettingsActionProvider.java(定义按钮的图标和功能)

package com.kale.actionbar01.provider;

import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.support.v4.view.ActionProvider;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageButton; import com.kale.actionbar01.R; /**
* @author:Jack Tony
* 感谢:http://www.bdqn.cn/news/201308/10625.shtml
* @date :2014-7-28
*/
public class SettingsActionProvider extends ActionProvider { /** An intent for launching the system settings. */
private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS); /** Context for accessing resources. */
private final Context mContext; public SettingsActionProvider(Context context) {
super(context);
mContext = context;
System.out.println("----初始化 SettingsActionProvider----");
} @Override
public View onCreateActionView() {
// Inflate the action view to be shown on the action bar.
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
View view = layoutInflater.inflate(R.layout.setting_layout, null);
ImageButton button = (ImageButton) view.findViewById(R.id.imageButton_id);
// Attach a click listener for launching the system settings.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mContext.startActivity(sSettingsIntent);
}
});
return view;
} /**
* {@inheritDoc}
*/
@Override
public boolean onPerformDefaultAction() {
// This is called if the host menu item placed in the overflow menu of the
// action bar is clicked and the host activity did not handle the click.
mContext.startActivity(sSettingsIntent);
return true;
}
}

范例二:

MyActionProvider.java(里面添加了子菜单,至于Item的图片在Activity中定义)

package com.kale.actionbar01.provider;

import android.content.Context;
import android.support.v4.view.ActionProvider;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.view.View; import com.kale.actionbar01.R; public class MyActionProvider extends ActionProvider { private final Context mContext; public MyActionProvider(Context context) {
super(context);
mContext = context;
System.out.println("----初始化 MyActionProvider----");
} @Override
public View onCreateActionView() {
// TODO 自动生成的方法存根
return null;
} @Override
public void onPrepareSubMenu(SubMenu subMenu) {
super.onPrepareSubMenu(subMenu);
subMenu.clear();
subMenu.add("SubMenu01").setIcon(R.drawable.ic_launcher)
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return true;
}
});
subMenu.add("SubMenu02").setIcon(R.drawable.ic_launcher)
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return true;
}
});
subMenu.add("SubMenu03").setIcon(R.drawable.ic_launcher)
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return true;
}
});
} @Override
public boolean hasSubMenu() {
//告诉系统,这个有子菜单
return true;
} }

使用方式:

1.xml布局 res/menu

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.kale.actionbar01.MainActivity" > <item android:id="@+id/menu_item_myProvider"
app:showAsAction="always"
android:title="自定义"
app:actionProviderClass="com.kale.actionbar01.provider.SettingsActionProvider"/> </menu>

然后

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu); return true;
}

2.用代码来建立

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
// 在代码中再定义一个自定义的actionProvider
MenuItem setItem = menu.add("setting").setIcon(R.drawable.ic_compose);
MenuItemCompat.setActionProvider(setItem, new MyActionProvider(this));
MenuItemCompat.setShowAsAction(setItem,
MenuItemCompat.SHOW_AS_ACTION_ALWAYS);return true;
}

二、使用ShareActionProvider

1.先在XML中定义,在代码中定义的方式同上

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.kale.actionbar01.MainActivity" > <item android:id="@+id/menu_item_share_provider"
app:showAsAction="ifRoom"
android:title="分享"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider" /> </menu>

2.在Activity中进行设置(得到对象,然后设置intent)

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu); shareProvider = (ShareActionProvider) MenuItemCompat
.getActionProvider(menu.findItem(R.id.menu_item_share_provider));
if (shareProvider == null) {
System.out.println("----------------> is null");
} else {
System.out.println("--------------not null-----------");
}
shareProvider
.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
shareProvider.setShareIntent(createShareIntent()); return true;
} /**
* @return The sharing intent.
*/
private Intent createShareIntent() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, "share");
return shareIntent;
}

三、将ActionBar改为分离式

感谢:http://www.xue5.com/Mobile/Mobile/738648.html

1.API > =14 , 在manifest文件中的activitiy节点或application节点中添加 uiOptions=“splitActionBarWhenNarrow”属性

2.API < 14 , 除了要添加以上属性以外,还需要在activity节点中添加如下节点:

<meta-dataandroid:name="android.support.UI_OPTIONS"android:value="splitActionBarWhenNarrow">

示例代码如下:

    <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:uiOptions="splitActionBarWhenNarrow" >
<meta-data
android:name="android.support.UI_OPTIONS"
android:value="splitActionBarWhenNarrow" /> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

四、在分离式的ActionBar上面实现ActionMode

  这个和之前讲的一样,完全没新的东西,直接上代码。

    public void buttonListener(View v) {
mMode = startSupportActionMode(new AnActionModeOfEpicProportions());
} private final class AnActionModeOfEpicProportions implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuItemCompat.setShowAsAction(
menu.add("Save").setIcon(R.drawable.ic_compose),
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
MenuItemCompat.setShowAsAction(
menu.add("Search").setIcon(R.drawable.ic_search),
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItemCompat.setShowAsAction(
menu.add("Refresh").setIcon(R.drawable.ic_refresh),
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItemCompat.setShowAsAction(
menu.add("Save").setIcon(R.drawable.ic_compose),
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItemCompat.setShowAsAction(
menu.add("Search").setIcon(R.drawable.ic_search),
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItemCompat.setShowAsAction(
menu.add("Refresh").setIcon(R.drawable.ic_refresh),
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); return true;
} @Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
} @Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Toast.makeText(MainActivity.this, "Got click: " + item,
Toast.LENGTH_SHORT).show();
mode.finish();
return true;
} @Override
public void onDestroyActionMode(ActionMode mode) {
}
}

源码下载:http://download.csdn.net/detail/shark0017/7687305

低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode的更多相关文章

  1. 低版本系统兼容的ActionBar(一)设置颜色+添加Menu+添加ActionMode

        之前我一直用ActionBarSherlock这个开源项目来做ActionBar,因为它可以让低版本的设备也能用上ActionBar.但是在最新的SDK中Google提供了一个AppCompa ...

  2. 低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment

    在ActionBar中添加Tab是很有用的技巧.在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图.我这里 ...

  3. 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航

    Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...

  4. 低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar

           一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="u ...

  5. 低版本系统兼容的ActionBar(七)自定义Actionbar标题栏字体

    这个自定义字体其实和ActionBar有关,但之前写AtionBar的时候没考虑到修改字体样式,今天看到一篇专门写这个的文章就贴上使用方式.╮(╯▽╰)╭,不得不说Actionbar的那个样式真是让人 ...

  6. 低版本系统兼容的ActionBar(五)修改ActionBar的全套样式,从未如此简单过

         设定ActionBar的样式,是我们必须掌握的技能,在之前我们可能都需要一行一行的写代码,然后在模拟器上测试效果,但是现在我们有个一个很棒的工具来设定样式.设定ActionBar样式的工作从 ...

  7. hyperscan在低版本系统应用问题

    编译环境:centos6.3 32位/64位 由于hyperscan使用许多C++11特性,在低版本系统gcc版本不能编译.后来发现在runtime时也就是hs_scan时只需要依赖libhs_run ...

  8. Android 高版本API方法在低版本系统上的兼容性处理

    Android 版本更替,新的版本带来新的特性,新的方法. 新的方法带来许多便利,但无法在低版本系统上运行,如果兼容性处理不恰当,APP在低版本系统上,运行时将会crash. 本文以一个具体的例子说明 ...

  9. angularjs1+requirejs+ bootstrap+ jQuery低版本配合兼容ie8+浏览器

    angularjs兼容低版本IE浏览器(IE8)angularjs在1.3之后的版本都是选择放弃对IE8及更低IE版本的支持,但是就目前的开发形式来看,IE8的使用客户还是蛮多的,最近有个项目要求尽量 ...

随机推荐

  1. hdu 2795 公告板 (单点最值)

    题意:有个公告板,大小为h*w,要贴n张公告,每个公告的长度是x,高度固定为1,公告放的要尽可能靠上并尽可能靠左,每给出一张公告,要求这个公告在满足要求的情况下放在了第几层. Sample Input ...

  2. 【PAT】1043 Is It a Binary Search Tree(25 分)

    1043 Is It a Binary Search Tree(25 分) A Binary Search Tree (BST) is recursively defined as a binary ...

  3. 修改Linux的基本配置

    1.修改主机名 vi /etc/sysconfig/network 2.修改ip地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes   ...

  4. PHP编辑器分享

    Sublime 1 .安装了追踪插件,ctrl+鼠标左键点击PHP函数跳到函数声明的位置. 2.已汉化 链接:http://pan.baidu.com/s/1hs5qonE 密码:b8fw 相关文章: ...

  5. Centos下命令行编译MapReduce代码(Java)并打包在Hadoop中执行

    前提条件:搭建好Hadoop系统 新建文件夹:input  和  output hdfs dfs -mkdir /inputhdfs dfs -mkdir /output 查看文件系统 hdfs df ...

  6. 利用HTML5定位功能,实现在百度地图上定位(转)

    原文:利用HTML5定位功能,实现在百度地图上定位 代码如下: 测试浏览器:ie11定位成功率100%,Safari定位成功率97%,(add by zhj :在手机上测试(用微信内置浏览器打开),无 ...

  7. 014.Zabbix的Agent key

    一 常见key 1.1 监控网卡流量的key net.if.{in/out}[if,<mode>] if表示网卡接口,mode表示取值类型. mode参数:bytes(默认),packet ...

  8. rabbitmq学习(三) —— 工作队列

    工作队列,又称任务队列,主要思想是避免立即执行资源密集型任务,并且必须等待完成.相反地,我们进行任务调度,我们将一个任务封装成一个消息,并将其发送到队列.工作进行在后台运行不断的从队列中取出任务然后执 ...

  9. java List/ArrayList 解惑

    导读:祖传挖坟派学习方法(宝儿姐友情支持) 第一部分  List简介 第二部分  何为ArrayList 第三部分  代码示例 第四部分  吹牛 如果你急需想搞清楚一些问题可以先看这里的总结 再后续看 ...

  10. Java 操纵XML之创建XML文件

    Java 操纵XML之创建XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...