如上图
1:home区
2:Custom区
3:item区
4:overflow区
1:home区图片改变可在MainFest.xml对应的activity加上属性icon
文字的修改可在属性label里面修改
<activity
android:name="com.example.actionbartest.MainActivity"
<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 18px; line-height: 26px;">android:label="@string/name"
android:icon="@drawable/weather"
>
</activity>
图片也可以用
mActionBar.setIcon(R.drawable.book);//可以修改home区的图标
2:可以使用ActionBar的setCustomView(v);修改对应的视图
package com.liu.recorddemo;
import java.util.List;
import com.liu.recorddemo.db.DBHelper;
import com.liu.recorddemo.db.Record;
import com.liu.recorddemo.ui.RecordItemAdapter;
import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.LinearLayout;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
private ListView mList;
private RecordItemAdapter recordAdapter;
private DBHelper mHelper;
private List<Record> data;
private ActionBar mActionBar;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActionBar = this.getActionBar();
mActionBar.setDisplayHomeAsUpEnabled(true);
mActionBar.setDisplayShowTitleEnabled(false);
mActionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP,
ActionBar.DISPLAY_SHOW_CUSTOM);
mActionBar.setDisplayShowCustomEnabled(true);
mActionBar.setIcon(R.drawable.book);
mActionBar.show();
setContentView(R.layout.list_all);
init();
}
private LinearLayout linePre;
private boolean isExpan = false;
private int positionPre = -1;
private void init() {
mHelper = new DBHelper(this);
mList = (ListView) findViewById(R.id.list);
recordAdapter = new RecordItemAdapter(this);
data = mHelper.getAll();
recordAdapter.setData(data);
mList.setAdapter(recordAdapter);
mList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position,
long arg3) {
Log.d("haiyong.liu", "position=" + position);
LinearLayout line = (LinearLayout) v
.findViewById(R.id.expan_item);
if (positionPre == position && isExpan) {
line.setVisibility(View.GONE);
isExpan = false;
} else {
if (linePre != null) {
linePre.setVisibility(View.GONE);
}
line.setVisibility(View.VISIBLE);
isExpan = true;
}
linePre = line;
positionPre = position;
}
});
}
@Override
protected void onResume() {
super.onResume();
data = mHelper.getAll();
recordAdapter.setData(data);
recordAdapter.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);<span style="white-space:pre"> </span>//这里添加Item,也就是给ActionBar添加内容
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.record_menu:
Intent intent = new Intent();
intent.setAction("com.liu.recorddemo.recordactivity");
startActivity(intent);
break;
case android.R.id.home:<span style="white-space:pre"> </span>//home区的点击响应时间
this.finish();
return true;
default:
break;
}
return false;
}
}
3:item区
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu); //这里添加Item,也就是给ActionBar添加内容
return true;
}
4:我们看看menu目录下面的 main.xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/record_menu"
android:actionLayout="@layout/custom"
android:orderInCategory="101"
android:showAsAction="always"
android:title="@string/record"/>
<item
android:id="@+id/mode3"
android:actionLayout="@layout/custom"
android:orderInCategory="102"
android:showAsAction="always"
android:title="@string/record_stop"/>
<item
android:id="@+id/mode4"
android:actionLayout="@layout/custom"
android:orderInCategory="103"
android:showAsAction="always"
android:title="@string/record_stop"/>
<item
android:id="@+id/mode5"
android:actionLayout="@layout/custom"
android:orderInCategory="104"
android:showAsAction="always"
android:title="@string/record"/>
<item
android:id="@+id/mode6"
android:actionLayout="@layout/custom"
android:orderInCategory="105"
android:showAsAction="ifRoom"
android:title="@string/record_stop"/>
<item
android:id="@+id/mode7"
android:actionLayout="@layout/custom"
android:orderInCategory="106"
android:showAsAction="never"
android:title="@string/record_stop"/>
<!--
<item
android:id="@+id/mode5"
android:showAsAction="always"
android:orderInCategory="104"
android:title="@string/record_stop"/>
<item
android:id="@+id/mode6"
android:showAsAction="ifRoom|withText"
android:orderInCategory="105"
android:title="@string/record_stop"/>
<item
android:id="@+id/mode7"
android:showAsAction="never"
android:orderInCategory="106"
android:title="@string/record_stop"/>
<item
android:id="@+id/mode9"
android:orderInCategory="108"
android:showAsAction="always"
android:title="@string/record_stop"/>
-->
</menu>
android:orderInCategory="108" //作用是item的排版先后顺序,数字越大越靠后
android:actionLayout="@layout/custom"<span style="white-space:pre"> </span>//item也可以是自己的布局文件
如果
android:showAsAction="always" //ifRoom never
如果设置为always则显示在bar上,如果设置为never,则把该item添加到overflow区,就是三个点的那里;或者有些手机是显示到menu键的响应按钮上面,如下图
还有一种ActionBar的视图,假如我们长按ListView的某一项,设置响应时间
package com.liu.recorddemo;
import java.util.List;
import com.liu.recorddemo.db.DBHelper;
import com.liu.recorddemo.db.Record;
import com.liu.recorddemo.ui.RecordItemAdapter;
import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.LinearLayout;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
private ListView mList;
private RecordItemAdapter recordAdapter;
private DBHelper mHelper;
private List<Record> data;
private ActionBar mActionBar;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActionBar = this.getActionBar();
mActionBar.setDisplayHomeAsUpEnabled(true);
mActionBar.setDisplayShowTitleEnabled(false);
mActionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP,
ActionBar.DISPLAY_SHOW_CUSTOM);
mActionBar.setDisplayShowCustomEnabled(true);
mActionBar.setIcon(R.drawable.book);
mActionBar.show();
setContentView(R.layout.list_all);
init();
}
private LinearLayout linePre;
private boolean isExpan = false;
private int positionPre = -1;
private void init() {
mHelper = new DBHelper(this);
mList = (ListView) findViewById(R.id.list);
recordAdapter = new RecordItemAdapter(this);
data = mHelper.getAll();
recordAdapter.setData(data);
mList.setAdapter(recordAdapter);
mList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position,
long arg3) {
Log.d("haiyong.liu", "position=" + position);
LinearLayout line = (LinearLayout) v
.findViewById(R.id.expan_item);
if (positionPre == position && isExpan) {
line.setVisibility(View.GONE);
isExpan = false;
} else {
if (linePre != null) {
linePre.setVisibility(View.GONE);
}
line.setVisibility(View.VISIBLE);
isExpan = true;
}
linePre = line;
positionPre = position;
}
});
mList.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
showActionMode();<span style="white-space:pre"> </span>//长按ListView选项出现ActionBar
return true;
}
});
}
private void showActionMode() {
ModeCallBack cb = new ModeCallBack();
startActionMode(cb);
}
private class ModeCallBack implements ActionMode.Callback{<span style="white-space:pre"> </span>//关键
@Override
public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean onCreateActionMode(ActionMode arg0, Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_action_mode, menu); //添加item
return true;
}
@Override
public void onDestroyActionMode(ActionMode arg0) {
// TODO Auto-generated method stub
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu arg1) {
ViewGroup v = (ViewGroup) LayoutInflater.from(MainActivity.this).inflate(R.layout.custom, null);
mode.setCustomView(v);
return true;
}
}
@Override
protected void onResume() {
super.onResume();
data = mHelper.getAll();
recordAdapter.setData(data);
recordAdapter.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.record_menu:
Intent intent = new Intent();
intent.setAction("com.liu.recorddemo.recordactivity");
startActivity(intent);
break;
case android.R.id.home:
this.finish();
return true;
default:
break;
}
return false;
}
}
这种在下面显示的ActionBar要在MainFest.xml文件里面添加 android:uiOptions =" splitActionBarWhenNarrow "
<activity
android:name="com.liu.recorddemo.MainActivity"
android:theme="@android:style/Theme.Holo.Light"
android:uiOptions="splitActionBarWhenNarrow" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
但是cumstomview还是在上方(图片上面的红字部分)
还有item和home的监听都是在函数里面
onOptionsItemSelected
home区的监听是 android.R.id.home
tip:零碎的点
actionBar.setDisplayShowHomeEnabled(true) //使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标,对应id为android.R.id.home,对应ActionBar.DISPLAY_SHOW_HOME
actionBar.setDisplayShowCustomEnabled(true) // 使自定义的普通View能在title栏显示,即actionBar.setCustomView能起作用,对应ActionBar.DISPLAY_SHOW_CUSTOM
其中setHomeButtonEnabled和setDisplayShowHomeEnabled共同起作用,如果setHomeButtonEnabled设成false,即使setDisplayShowHomeEnabled设成true,图标也不能点击