玩转android之Action bar
背景:
在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果。
常用属性:
1.showAsAction:
当你的应用程序目标设为蜂巢平台时,你可以利用Action Bar部件提供的全部功能,将你的选项菜单项放在Action Bar的右上角,对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。
这个属性可接受的值有:
1、always:这个值会使菜单项一直显示在Action Bar上。
2、ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。
3、never:这个值使菜单项永远都不出现在Action Bar上。
4、withText:这个值使菜单项和它的图标,菜单文本一起显示。
常用功能:搜索、分享、刷新、下拉列表、更多
目标:
实现:
MainActivity.java
package com.hitwh.readscarf;
import java.lang.reflect.Field;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.ViewConfiguration;
import android.widget.ArrayAdapter;
import android.widget.ShareActionProvider;
import android.widget.Toast;
public class MainActivity extends Activity {
private String[] actions = new String[] { "Action-1", "Action-2", "Action-3" };
private MenuItem menuItem = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 显示ActionBar
ActionBar actionBar = getActionBar();
actionBar.show();
// 显示扩展menu
getOverflowMenu();
// 显示DropDownList
/** Create an array adapter to populate dropdownlist */
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getBaseContext(),
android.R.layout.simple_spinner_dropdown_item, actions);
/** Enabling dropdown list navigation for the action bar */
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
/** Setting dropdown items and item navigation listener for the actionbar */
actionBar.setListNavigationCallbacks(adapter, navigationListener);
}
/**
* 默认 Navigation listener
**/
ActionBar.OnNavigationListener navigationListener = new OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition,
long itemId) {
Toast.makeText(getBaseContext(),
"You selected : " + actions[itemPosition],
Toast.LENGTH_SHORT).show();
return false;
}
};
/**
* 创建 Menu
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// 加载 Menu
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
// 加载分享menu
ShareActionProvider provider = (ShareActionProvider) menu.findItem(R.id.share).getActionProvider();
// 初始化 Share Intent
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "Text I want to share");
provider.setShareIntent(intent);
return true;
}
/**
* Menu 选择事件
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
// 刷新menu
case R.id.refresh:
menuItem = item;
menuItem.setActionView(R.layout.progressbar);
TestTask task = new TestTask();
task.execute("test");
break;
// 保存menu
case R.id.save:
Toast.makeText(this, "Menu Item save selected", Toast.LENGTH_SHORT).show();
break;
// 搜索menu
case R.id.search:
Toast.makeText(this, "Menu Item search selected", Toast.LENGTH_SHORT).show();
break;
// 分享menu
case R.id.share:
Toast.makeText(this, "Menu Item share selected", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
/**
* 显示更多菜单
*/
private void getOverflowMenu() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if(menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 显示加载进度条
* @author Mr-rxz
*
*/
private class TestTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// Simulate something long running
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
// 这个方法需要 API 14 以上
menuItem.collapseActionView();
menuItem.setActionView(null);
}
};
}
menu/main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/save"
android:showAsAction="collapseActionView"
android:title="save"/>
<item
android:id="@+id/refresh"
android:orderInCategory="2"
android:showAsAction="always"
android:icon="@android:drawable/ic_popup_sync"
android:title="refresh"/>
<item
android:id="@+id/search"
android:orderInCategory="1"
android:actionViewClass="android.widget.SearchView"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="ifRoom|collapseActionView"
android:title="search"/>
<item
android:id="@+id/share"
android:actionProviderClass="android.widget.ShareActionProvider"
android:showAsAction="collapseActionView"
android:title="Share"/>
</menu>