actionbar在2.x及以前的版本使用中,要导入支持的jar包,现在在3.0以上的版本都包含有actionbar了,直接使用就可以了。
1.按标题
public class MainActivity extends Activity {
private TextView txt;
private ActionBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView() {
txt = (TextView) findViewById(R.id.tv_txt);
bar = getActionBar();
bar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId()==android.R.id.home){
Toast.makeText(this, "press home!!", 1000).show();
}
return super.onOptionsItemSelected(item);
}
}
2.图标
public class TestMain extends Activity {
private TextView txt;
private ActionBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView() {
txt = (TextView) findViewById(R.id.tv_txt);
bar = getActionBar();
bar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.bar, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if (item.getItemId() == android.R.id.home) {
Toast.makeText(this, "press home!!", 1000).show();
} else if (item.getItemId() == R.id.menu_action_icon1) {
Toast.makeText(this, "action 1", 1000).show();
} else if (item.getItemId() == R.id.menu_action_icon2) {
Toast.makeText(this, "action 2", 1000).show();
}
return super.onOptionsItemSelected(item);
}
}
menu中的bar.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_action_icon1"
android:showAsAction="ifRoom"
android:title="Action1"/>
<item
android:id="@+id/menu_action_icon2"
android:icon="@drawable/creep002"
android:showAsAction="ifRoom"
android:title="Action2"/>
</menu>
3.搜索
public class TestMain extends Activity {
private ActionBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView() {
bar = getActionBar();
bar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.bar, menu);
// 搜索
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search)
.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// TODO Auto-generated method stub
// 跳转到搜索结果界面
Intent intent = new Intent(TestMain.this, TestResult.class);
intent.putExtra("str", query);
startActivity(intent);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
}
如果想初始化的时候,searchview是伸展的,那么设置:
// 初始化时,该组件是展开的
searchView.setIconified(false);
并且,在menu中:
android:showAsAction="ifRoom"
menu:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_search"
android:actionViewClass="android.widget.SearchView"
android:icon="@drawable/icon_search"
android:showAsAction="collapseActionView|ifRoom"
android:title="Search"/>
</menu>
4.下拉列表
public class TestMain extends Activity implements OnNavigationListener {
private ActionBar bar;
private int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView() {
bar = getActionBar();
bar.setDisplayHomeAsUpEnabled(true);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, new String[] { "First",
"Second","Third" });
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bar.setListNavigationCallbacks(adapter, this);
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
// TODO Auto-generated method stub
// 初始化的时候会响应一次,跳过初始化的那一次响应
if (i == 0) {
i++;
return false;
}
Toast.makeText(this, "pos:" + itemPosition, 1000).show();
return false;
}
}
当然,这个界面不是很友好(用arrayadapter或者spinner),那么最好就是自定义了。
5.pop:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_search"
android:actionViewClass="android.widget.SearchView"
android:icon="@drawable/icon_search"
android:showAsAction="collapseActionView|ifRoom"
android:title="Search"/>
<item
android:id="@+id/menu_action_icon2"
android:icon="@drawable/creep002"
android:showAsAction="ifRoom"
android:title="Action2">
<menu>
<item
android:id="@+id/menu_icon1"
android:icon="@drawable/creep001"
android:showAsAction="ifRoom"
android:title="Action1"/>
<item
android:id="@+id/menu_icon2"
android:icon="@drawable/creep001"
android:showAsAction="ifRoom"
android:title="Action2"/>
</menu>
</item>
</menu>
弹出子组件,其实也可以使用分享组件。
注意:
1.android:showAsAction五个属性:
never:永远不会显示。只会在溢出列表中显示。
ifRoom:会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。
always:无论是否溢出,总会显示。
withText:Title会显示
collapseActionView:可扩展的item。
2.actionbar的设置:
actionBar.hide() :
隐藏标题栏
显示标题栏
setHomeButtonEnabled这个小于4.0版本的默认值为true的。但是在4.0及其以上是false,该方法的作用:决定左上角的图标是否可以点击。没有向左的小图标。 true 图标可以点击 false 不可以点击。
actionBar.setDisplayHomeAsUpEnabled(true) :
给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
actionBar.setDisplayShowHomeEnabled(true) :
使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标,对应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。
其中setHomeButtonEnabled和setDisplayShowHomeEnabled共同起作用,如果setHomeButtonEnabled设成false,即使setDisplayShowHomeEnabled设成true,图标也不能点击。
mactionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP|ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_SHOW_CUSTOM|ActionBar.DISPLAY_SHOW_TITLE);
3.背景:
bar.setBackgroundDrawable(getResources().getDrawable(R.drawable.BackBar));
backBar为定义在style xml中的,仅仅是更改背景颜色。
<drawable name="BackBar">#123400</drawable>
如果想改变弹出的pop背景色,修改主题就可以,记得父主题不能是继承的其他自定义主题:
<!-- Application theme. -->
<style name="AppTheme" parent="android:style/Theme.Holo.Light">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
<item name="android:popupMenuStyle">@style/MyPopupMenu</item>
</style>
<style name="MyPopupMenu" parent="android:style/Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">#0000ff</item>
</style>
修改title的颜色的话,直接在使用的主题中改变textcolor就可以了:
<item name="android:textColor">@color/white</item>
4.修改title的颜色
<style name="acbar_titlestyle">
<item name="android:textColor">@color/white</item>
</style>
然后在actionbar的主题中引用:
<style name="MyActionBar" parent="@android:style/Widget.Holo.ActionBar">
<item name="android:titleTextStyle">@style/acbar_titlestyle</item>
5.修改item字体:
MenuItem msgItem=imenu.findItem(R.id.menu_msg);
SpannableString spanmsg=new SpannableString("消息");
spanmsg.setSpan(new ForegroundColorSpan(Color.WHITE), 0, spanmsg.length(), 0);
msgItem.setTitle(spanmsg);
另外,应该可以在style中更改样式的,可以没找到这个方法,有知道的给我说下哈!
6.仿微信的按menu弹出扩展item的方法。其实没啥技巧的,其实是布局的问题,要把扩展的showasaction item设置为可扩展。
例如:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/action_settings"/>
<item
android:showAsAction="always"
android:title="@string/action_settings"/>
<item
android:showAsAction="collapseActionView"
android:title="@string/action_settings">
</item>
</menu>
试试看吧,just go!