ActionBar是Google在3.0中引入的另类menu菜单,不同与menu的是, 它显示在界面顶端,它比menu更灵活,更简洁。在4.0版本的应用中多有使用,例如短信,浏览器,图库。它会根据屏幕的布局显示情况,决定显示为传统的menu还是ActionBar。一般ActionBar也会定义和menu相同的菜单定义文件,在Activity中同样通过onCreateOptionsMenu(Menu menu)加载此布局,根据menu定义文件的属性决定是否显示为ActionBar。
一,ActionBar的显示选项。通过 ActionBar.setDisplayOptions(change, flags)可设置ActionBar的显示选项。
ActionBar.DISPLAY_HOME_AS_UP 在ActionBar左边显示'<'图标,在应用中可以通过点击此图标回到应用的主页。
ActionBar.DISPLAY_SHOW_HOME 在ActionBar左边显示Home图标,就是此应用的icon图标,点击它也可以返回到首页。
ActionBar.DISPLAY_USE_LOGO 在Home图标的位置显示我们设置的logo图标,Activity的android:logo="@drawable/apidemo_androidlogo"属性
ActionBar.DISPLAY_SHOW_TITLE 显示图标后面的标题名称,Activity的lable属性
ActionBar.DISPLAY_SHOW_CUSTOM 显示通过setCustomView添加到ActionBar的自定义View
ActionBar.NAVIGATION_MODE_TABS 设置此属性,将显示我们添加到ActionBar的Tab,类似于TabHost
二,设定menu选项是否以ActionBar方式显示。设定menu中item的showAsAction属性。
android:showAsAction="ifRoom" 如果屏幕顶部有足够空间,菜单项显示为ActionBar
android:showAsAction="always" 菜单项总是显示为ActionBar
android:showAsAction="never" 菜单项不会显示为ActionBar
三,在布局文件中指订ActionBar的View 使用android:actionViewClass="android.widget.SearchView"属性,当点击此ActionBar的图标会显示指定的View。
四,ActionBar也可以的添加,就像动态添加菜单一样。
MenuItem actionItem = menu.add("Action Button"); actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);五,使用ActionBar显示TabHost的效果。
添加tab项
final ActionBar bar = getActionBar(); //得到ActionBar对象 bar.addTab(bar.newTab() //添加tab项 .setText(text) //设置tab标签标题 .setTabListener(new TabListener(new TabContentFragment(text)))); //设置tab的内容设置ActionBar以Tab导航模式显示
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
六,在布局文件中设置Button的单击事件,设置Button的android:onClick="onAddTab" 属性,其中onAddTab需要在Button启用的Activity中定义此方法,当Button被点击时就会调用次方法。
七,使用ActionProvider。 ActionProvider可以为ActionBar或者menu提供一个动作内容,例如转去Settings,Message,和Activity的跳转很类似。
首先需要定义ActionProvider
public static class SettingsActionProvider extends ActionProvider {
/** An intent for launching the system settings. */
private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS);
/** Context for accessing resources. */
private final Context mContext;
/**
* Creates a new instance.
*
* @param context Context for accessing resources.
*/
public SettingsActionProvider(Context context) {
super(context);
mContext = context;
}
/**
* {@inheritDoc}
*/
@Override
public View onCreateActionView() {
// Inflate the action view to be shown on the action bar.
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
View view = layoutInflater.inflate(R.layout.action_bar_settings_action_provider, null);
ImageButton button = (ImageButton) view.findViewById(R.id.button);
// Attach a click listener for launching the system settings.
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mContext.startActivity(sSettingsIntent);
}
});
return view;
}
/**
* {@inheritDoc}
*/
@Override
public boolean onPerformDefaultAction() {
// This is called if the host menu item placed in the overflow menu of the
// action bar is clicked and the host activity did not handle the click.
mContext.startActivity(sSettingsIntent);
return true;
}
}
然后将ActionProvider添加到ActionBar中,设置android:actionProviderClass="com.example.android.apis.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider"属性就可以,
这样,点击这个ActionBar就会转到设定的Activity。感觉这个类似于给以个Button添加了监听。
八,菜单布局的加载方法,在onCreateOptionsMenu方法中使用getMenuInflater().inflate(R.menu.action_bar_settings_action_provider, menu);
九,Activity中使用的流
inputStream = getResources().openRawResource(R.raw.robot); //打开Raw资源文件夹的流,读取其中指定的图片
outputStream = openFileOutput(SHARED_FILE_NAME,
Context.MODE_WORLD_READABLE | Context.MODE_APPEND); //以指定模式打开一输入流