ActionBar
本文参考 Android Developers和网上同学的一些技术博客,总结成符合自己学习的思路。
Action Bar
当我们布局的时候可以考虑拆分Action Bar
图标数目布局建议
360-499 dp = 3 icons
500-599 dp = 4 icons
600 dp and larger = 5 icons
上下文Action Bars
添加/隐藏ActionBar的方法
/**
* 添加ActionBar的方法 隐藏的为
* actionBar.hide();
* ***/
ActionBar actionBar=getActionBar();
actionBar.show();
添加ActionBar 的Item
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_search"
android:actionLayout="@layout/collapsibleview"
android:icon="@drawable/ic_common_title_bar_search"
android:orderInCategory="100"
android:showAsAction="collapseActionView"
android:title="搜索"/>
<item
android:id="@+id/action_share"
android:icon="@drawable/ic_context_menu_share"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"
android:title="分享"/>
<item
android:id="@+id/action_camera"
android:icon="@drawable/ic_context_menu_camera"
android:orderInCategory="100"
android:showAsAction="ifRoom|collapseActionView"
android:title="相机"/>
<item
android:id="@+id/action_remove"
android:icon="@drawable/ic_context_menu_remove"
android:showAsAction="ifRoom|collapseActionView"
android:title="删除"/>
</menu>
引入布局
@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;
}
PS:注意搜索里面多了一句android:actionLayout="@layout/collapsibleview"下面有用到
对ActionBar 的Item的事件处理
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_camera:
Toast.makeText(MainActivity.this, "你点击了"+item.getTitle(), 0).show();
return true;
case R.id.action_remove:
Toast.makeText(MainActivity.this, "你点击了"+item.getTitle(), 0).show();
return true;
case R.id.action_search:
Toast.makeText(MainActivity.this, "你点击了"+item.getTitle(), 0).show();
return true;
case R.id.action_share:
Toast.makeText(MainActivity.this, "你点击了"+item.getTitle(), 0).show();
return true;
case android.R.id.home:
// 当Action Bar的图标被单击时执行下面的Intent
startActivity(new Intent(this, MainActivity.class));
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
使用分割式ActionBar的方法
/***
* NAVIGATION_MODE_TABS
* 设置Actionbar的模式为分割Tab模式
* ***/
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// 新建3个Tab
ActionBar.Tab tabA = actionBar.newTab().setText("选项一").setIcon(R.drawable.ic_context_menu_camera);
ActionBar.Tab tabB = actionBar.newTab().setText("选项二").setIcon(R.drawable.ic_context_menu_share);
ActionBar.Tab tabC = actionBar.newTab().setText("选项三").setIcon(R.drawable.ic_context_menu_remove);
// 绑定到Fragment
Fragment fragmentA = new AFragmentTab();
Fragment fragmentB = new BFragmentTab();
Fragment fragmentC = new CFragmentTab();
tabA.setTabListener(new MyTabsListener(fragmentA));
tabB.setTabListener(new MyTabsListener(fragmentB));
tabC.setTabListener(new MyTabsListener(fragmentC));
actionBar.addTab(tabA);
actionBar.addTab(tabB);
actionBar.addTab(tabC);
对每个Tab设置事件处理
tabA.setTabListener(new MyTabsListener(fragmentA));
自定义事件类
protected class MyTabsListener implements ActionBar.TabListener {
private Fragment fragment;
public MyTabsListener(Fragment fragment) {
this.fragment = fragment;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
}
实现的效果如下:
添加一个动作视图,比如自定义搜索框和按钮
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:paddingRight="5dip"
android:src="@drawable/ic_common_title_bar_search" />
<EditText
android:id="@+id/colla_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/search" />
</RelativeLayout>
点击收索时候会出现以下界面
可折叠的动作视图
这个没有看懂什么意思,官方文档翻译如下: 操作视窗让你在不改变Activity或Fragment的情况下,就可以给用户提供快捷的访问和丰富的操作。但是,默认情况下让操作视窗可见可能不太合适。要保证操作栏的空间(尤其是在小屏幕设备上运行时),你能够把操作视窗折叠进一个操作项按钮中。当用户选择这个按钮时,操作视窗就在操作栏中显示。被折叠的时候,如果你定义了android:showAsAction=”ifRoom”属性,那么系统可能会把这个项目放到溢出菜单中,但是当用户选项了这个菜单项,它依然会显示在操作栏中。通过给android:showAsAction属性添加“collapseActionView”属性值,你能够让操作视窗可以折叠起来。
因为在用户选择这个项目时,系统会展开这个操作视窗,所以你不必要在onOptionsItemSelected()回调方法中响应这个菜单项。在用户选择这个菜单项时,系统会依然调用onOptionsItemSelected()方法,但是除非你在方法中返回了true(指示你已经替代系统处理了这个事件),否则系统会始终展开这个操作视窗。
当用户选择了操作栏中的“向上”图标或按下了回退按钮时,系统也会把操作视窗折叠起来。
如果需要,你能够在代码中通过在expandActionView()和collapseActionView()方法来展开或折叠操作视窗。
注意:尽管把操作视窗折叠起来是可选的,但是,如果包含了SearchView对象,我们推荐你始终把这个视窗折叠起来,只有在需要的时候,由用户选择后才把它给展开。在提供了专用的“搜索”按钮的设备上也要小心了,如果用户按下了“搜索”按钮,那么也应该把这个搜索视窗给展开,简单的重写Activity的onKeyUp()回调方法,监听KEYCODE_SEARCH类型的按键事件,然后调用expandActionView()方法,就可以把操作视窗给展开。
如果你需要根据操作视窗的可见性来更新你的Activity,那么你可以定义一个OnActionExpandListener事件,并且用setOnActionExpandListener()方法来注册这个事件,然后就能够在操作视窗展开和折叠时接受这个回调方法了,如:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
MenuItem menuItem = menu.findItem(R.id.actionItem);
...
// When using the support library, the setOnActionExpandListener() method is
// static and accepts the MenuItem object as an argument
MenuItemCompat.setOnActionExpandListener(menuItem, new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
});
}
添加一个操作提供器
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
intent.putExtra(Intent.EXTRA_TEXT, "每日一笑,好东西要分享哦~~");
startActivity(Intent.createChooser(intent, getTitle()));
Actionbar下拉列表模式
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
// 生成一个SpinnerAdapter
SpinnerAdapter adapter = ArrayAdapter.createFromResource(this,
R.array.people, android.R.layout.simple_spinner_dropdown_item);
// 将ActionBar的操作模型设置为NAVIGATION_MODE_LIST
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
// 为ActionBar设置下拉菜单和监听器
actionBar.setListNavigationCallbacks(adapter,
new OnNavigationListener() {
// 得到和SpinnerAdapter里一致的字符数组
String[] listNames = getResources().getStringArray(
R.array.people);
/* 当选择下拉菜单项的时候,将Activity中的内容置换为对应的Fragment */
@Override
public boolean onNavigationItemSelected(int itemPosition,
long itemId) {
// 生成自定的Fragment
Ftest student = new Ftest();
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager
.beginTransaction();
// 将Activity中的内容替换成对应选择的Fragment
// transaction.replace(android.R.id.content, student,
// listNames[itemPosition]);
Toast.makeText(MainActivity.this,
listNames[itemPosition], 0).show();
transaction.commit();
return true;
}
});
用的的Ftest类如下:
package com.example.actionbartab;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Ftest extends Fragment {
// Fragment对应的标签,当Fragment依附于Activity时得到
private String tag;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
tag = getTag();
}
@SuppressLint("ResourceAsColor")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setText(tag);
return textView;
}
}
效果如下:
<activity
android:name="com.example.actionbartab.MainActivity"
android:theme="@android:style/Theme.Holo.Light"
android:label="@string/app_name" >