ActionBar是3.0之后出现的控件,取代menu,显示在标题栏位置。
我们能在应用中看见的actionbar一般就是下图的样子,比如快图应用
1.App icon 应用的图标,左侧带应用相当于back返回键
2.ViewControl
3.Action button 相当于普通的Button可以监听点击事件
4.Action overflow 三个点,相当于手机上的menu键,可以显示隐藏的action button
通过getActionBar()得到对象。
1.普通ActionBar
创建方式与Menu(xml创建)一样,不过item中需要设定android:showAsAction属性,不设定就是默认never,item将为menu的item,选择always或者ifRoom将为ActionBar。
布局很简单 menu中写
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:title="aa"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:title="bb"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:title="cc"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:title="dd"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:title="ee"/>
</menu>
android:showAsAction
----->里面几个属性 never:从不显示actionbar
----->里面几个属性 ifRoom:如果有空间显示actionbar
----->里面几个属性 always:总是显示actionbar(慎用)
----->里面几个属性 withText:带有图片和文字显示actionbar
当actionbar中内容很多 会隐藏 有MNEU键的 按可以显示出来没有Menu的 会出现3个点
想一直显示三个点 用下面方法
<span style="color:#000000;">public class MainActivity xxx{
@Override
protected void onCreate(Bundle savedInstanceState) {
...
<span style="font-family:Comic Sans MS;">//调用即可</span>
getOverflowMenu();
}
//force to show overflow menu in actionbar
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();
}
}</span>
2.类似spinner效果
<span style="color:#000000;">package com.example.actionbardemo;
import java.lang.reflect.Field;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewConfiguration;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class MainActivity extends Activity {
private String[] title = { "测试一", "测试二", "测试三" };
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);
<span style="font-family:Comic Sans MS;"> //显示箭头
</span> actionBar.setDisplayHomeAsUpEnabled(true);
getOverflowMenu();
//类似spinner效果
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(MainActivity.this
,android.R.layout.simple_spinner_dropdown_item,title);
ActionBar.OnNavigationListener listener=new OnNavigationListener() {
@Override public boolean onNavigationItemSelected(int arg0, long
arg1) { // TODO Auto-generated method stub
Toast.makeText(MainActivity.this, title[arg0],0).show(); return
false; } }; actionBar.setListNavigationCallbacks(adapter, listener);
// 类似 Tabhost 效果
}
private void getOverflowMenu() {
try {
ViewConfiguration config = ViewConfiguration.get(MainActivity.this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
// 给home图标加监听
int id = item.getItemId();
// 系统id
if (id == android.R.id.home) {
Toast.makeText(MainActivity.this, "home", 0).show();
}
return super.onOptionsItemSelected(item);
}
}
</span>
3.类似tabhost效果package com.example.actionbardemo;
import java.lang.reflect.Field;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewConfiguration;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class MainActivity extends Activity implements TabListener {
private String[] title = { "测试一", "测试二", "测试三" };
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
getOverflowMenu();
/*
* // 类似spinner效果
* actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
* ArrayAdapter<String> adapter = new ArrayAdapter<String>(
* MainActivity.this, android.R.layout.simple_spinner_dropdown_item,
* title); ActionBar.OnNavigationListener listener = new
* OnNavigationListener() {
*
* @Override public boolean onNavigationItemSelected(int arg0, long
* arg1) { // TODO // Auto-generated // method // stub
* Toast.makeText(MainActivity.this, title[arg0], 0).show(); return
* false; } }; actionBar.setListNavigationCallbacks(adapter, listener);
*/
// 类似 Tabhost 效果
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Tab tab = actionBar.newTab();
tab.setIcon(android.R.drawable.ic_menu_add);
tab.setText("添加");
tab.setTag("tab001");
tab.setTabListener(this);
actionBar.addTab(tab);
Tab tab002 = actionBar.newTab();
tab002.setIcon(android.R.drawable.ic_menu_add);
tab002.setText("添加");
tab002.setTag("tab001");
tab002.setTabListener(this);
actionBar.addTab(tab002);
// Action Bar Tab must have a Callback 必须有回调
}
private void getOverflowMenu() {
try {
ViewConfiguration config = ViewConfiguration.get(MainActivity.this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 每个选项卡的监听
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
// 给home图标加监听
int id = item.getItemId();
// 系统id
if (id == android.R.id.home) {
Toast.makeText(MainActivity.this, "home", 0).show();
}
return super.onOptionsItemSelected(item);
}
}
显示在底部的ActionBar
在AndroidManifest里的Activity加上属性
android:uiOptions="splitActionBarWhenNarrow"后,普通ActionBar将不再显示在标题
栏部分,而是显示在屏幕底部:
actionBar.setDisplayHomeAsUpEnabled(true) // 给左上角图标的左边加上一个返
回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
actionBar.setDisplayShowHomeEnabled(true) //使左上角图标可点击,对应id为
android.R.id.home,对应ActionBar.DISPLAY_SHOW_HOME
actionBar.setDisplayShowCustomEnabled(true) // 使自定义的普通View能在title栏
显示,即actionBar.setCustomView能起作用,对应ActionBar.DISPLAY_SHOW_CUSTOM
actionBar.setDisplayShowTitleEnabled(true) //对应
ActionBar.DISPLAY_SHOW_TITLE
actionBar.hide() // 影藏标题栏
actionBar.show() // 显示标题栏