这篇文章主要讲的是在低版本兼容的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