这篇文章主要讲的是在低版本兼容的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. [转] React 最佳实践——那些 React 没告诉你但很重要的事

    前言:对很多 react 新手来说,网上能找到的资源大都是些简单的 tutorial ,它们能教会你如何使用 react ,但并不会告诉你怎么在实际项目中优雅的组织和编写 react 代码.用谷歌搜中 ...

  2. salesforce

    salesforce&apex salesforce开发的小心得 salesforce零基础学习(七十七)队列的实现以及应用 摘要: 队列和栈简单的区别为栈是后进先出,队列是先进先出.队列也是 ...

  3. 【LOJ】#2527. 「HAOI2018」染色

    题解 简单容斥题 至少选了\(k\)个颜色恰好出现\(S\)次方案数是 \(F[k] = \binom{M}{k} \frac{N!}{(S!)^{k}(N - i * S)!}(M - k)^{N ...

  4. windows + hadoop + eclipse 过程记录

    昨天在本机上搭建了伪分布式的hadoop,今天决定在eclipse中搭建hadoop的环境,毕竟磨刀不误砍柴工 安装的hadoop是2.7.5版本,要想使用eclipse写MapReduce需要一个  ...

  5. python常用库安装网址

    python常用库安装网址如下: http://pypi.python.org/pypi

  6. k8s 集群中的etcd故障解决

    一次在k8s集群中创建实例发现etcd集群状态出现连接失败状况,导致创建实例失败.于是排查了一下原因. 问题来源 下面是etcd集群健康状态: [root@docker01 ~]# cd /opt/k ...

  7. Spring框架学习01——使用IDEA开发Spring程序

    1.创建项目 点击“Create New Project”,新建项目 选择Maven项目 项目配置 使用本地安装的Maven 一直点击Next,最后点击完成当控制台中出现“BUILD SUCCESS” ...

  8. C#开发Unity游戏教程之游戏对象的属性变量

    C#开发Unity游戏教程之游戏对象的属性变量 Unity游戏对象的属性——变量 通过对上一章的学习,读者应该了解到了,游戏对象上的属性与脚本中的变量,建立联系的方式就是将脚本赋予游戏对象.上一章只是 ...

  9. 简单的Python 火车抢票程序

    当你想查询一下火车票信息的时候,你还在上12306官网吗?或是打开你手机里的APP?下面让我们来用Python写一个命令行版的火车票查看器, 只要在命令行敲一行命令就能获得你想要的火车票信息!如果你刚 ...

  10. BZOJ.1013.[JSOI2008]球形空间产生器(高斯消元)

    题目链接 HDU3571 //824kb 40ms //HDU3571弱化版 跟那个一比这个太水了,练模板吧. //列出$n+1$个二次方程后两两相减,就都是一次方程了. #include <c ...