Android 4 学习(20):ActionBar
参考《Pro Android 4.0》
ActionBar
11.0之后,ActionBar在Activity中默认存在,可以在代码中设置其显示与否:
ActionBar actionBar = getActionBar();
// Hide the Action Bar actionBar.hide();
// Show the Action Bar actionBar.show();
也可以在Manifest中设置是否显示ActionBar:
<activity android:name=”.MyNonActionBarActivity” android:theme=”@android:style/Theme.Holo.NoActionBar”>
创建一个不显示ActionBar的Theme:
<?xml version=”1.0” encoding=”utf-8”?>
<resources>
<style name=”NoActionBar” parent=”@style/ActivityTheme”>
<item name=”android:windowActionBar”>false</item>
</style>
</resources>
ActionBar的其他设置:
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(displayLogo);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setSubtitle(“Inbox”);
actionBar.setTitle(“Label:important”);
Resources r = getResources();Drawable myDrawable = r.getDrawable(R.drawable.gradient_header); actionBar.setBackgroundDrawable(myDrawable);
//ActionBar float above content
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.main);
}
使用ActionBar做导航
新建一个Tab:
Tab tabOne = actionBar.newTab();
tabOne.setText(“First Tab”).setIcon(R.drawable.ic_launcher).setContentDescription(“Tab the First”).setTabListener(
new TabListener<MyFragment>(this, R.id.fragmentContainer, MyFragment.class));
actionBar.addTab(tabOne);
实现TabListener接口:
public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
private MyFragment fragment;
private Activity activity;
private Class<T> fragmentClass;
private int fragmentContainer;
public TabListener(Activity activity, int fragmentContainer, Class<T> fragmentClass) {
this.activity = activity;
this.fragmentContainer = fragmentContainer;
this.fragmentClass = fragmentClass;
}
// Called when a new tab has been selected
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (fragment == null) {
String fragmentName = fragmentClass.getName();
fragment = (MyFragment)Fragment.instantiate(activity, fragmentName);
ft.add(fragmentContainer, fragment, null);
fragment.setFragmentText(tab.getText());
} else {
ft.attach(fragment);
}
}
// Called on the currently selected tab when a different tag is selected.
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (fragment != null) {
ft.detach(fragment);
}
}
// Called when the selected tab is selected.public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO React to a selected tab being selected again. }
}
将TabListener与Tab绑定在一起:
Tab tabOne = actionBar.newTab();
TabListener<EarthquakeListFragment> listTabListener = new TabListener<EarthquakeListFragment>(this, R.id.EarthquakeFragmentContainer, EarthquakeListFragment.class);
tabOne.setTabListener(listTabListener);
使用下拉框导航:
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
ArrayList<CharSequence> al = new ArrayList<CharSequence>();
al.add(“Item 1”);al.add(“Item 2”);
ArrayAdapter<CharSequence> dropDownAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_list_item_1, al);
// Select the drop-down navigation mode.
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
// Create a new Spinner Adapter that contains the values to be displayed in the drop down.
ArrayAdapter dropDownAdapter = ArrayAdapter.createFromResource(this, R.array.my_dropdown_values, android.R.layout.simple_list_item_1);
// Assign the callbacks to handle drop-down selections.
actionBar.setListNavigationCallbacks(dropDownAdapter, new OnNavigationListener() {
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
// TODO Modify your UI based on the position of the drop down item selected.
return true; }
});
使用菜单和ActionBar Item
Android Actionbar中常用的Menu类型:
1. Icon Menu:在ActionBar中以图标形式显示的Menu
2. Expanded and overflow Menu: 点击more出现的菜单,显示文本而不是图标。
3. Submenu
创建菜单
重写Activity中的onCreateOptionMenus方法可以创建菜单:
static final private int MENU_ITEM = Menu.FIRST;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Group ID
int groupId = 0;
// Unique Menu Item identifier. Used for event handling
int menuItemId = MENU_ITEM;
// The order position of the item
int menuItemOrder = Menu.NONE;
// Text to be displayed for this Menu Item
int menuItemText = R.string.menu_item;
// Create the Menu Item and keep a reference to it
MenuItem menuItem = menu.add(groupId, menuItemId, menuItemOrder, menuItemText);
return true;
}
创建MenuItem的几个参数:
1. MenuItem所在Group的ID
2. MenuItem的ID,后面可以用findItem方法获取对应的MenuItem
3. MenuItem在组内的顺序
4. MenuItem显示的文本
获取已创建的MenuItem:
MenuItem menuItem = menu.findItem(MENU_ITEM);
设置MenuItem的显示方式
使用setShowAsActionFlags 方法,可以设置MenuItem在ActionBar中的显示:
SHOW_AS_ACTION :永远在ActionBar中显示
SHOW_AS_IF_SPACE :当ActionBar有空白位置的时候显示
MenuItem类型
1. CheckBox:
// Create a new check box item.
menu.add(0, CHECKBOX_ITEM, Menu.NONE, “CheckBox”).setCheckable(true);
2. Radio Buttons:
// Create a radio button group.
menu.add(RB_GROUP, RADIOBUTTON_1, Menu.NONE, “Radiobutton 1”);
menu.add(RB_GROUP, RADIOBUTTON_2, Menu.NONE, “Radiobutton 2”);
menu.add(RB_GROUP, RADIOBUTTON_3, Menu.NONE, “Radiobutton 3”).setChecked(true);
3. 快捷键
// Add a shortcut to this Menu Item, ‘0’ if using the numeric keypad or ‘b’ if using the full keyboard.
menuItem.setShortcut(‘0’, ‘b’);
4. Condensed Title (Condensed Title是指在icon menu的状态下显示的标题,在扩展(more)那里会显示全标题。)
menuItem.setTitleCondensed(“Short Title”);
5. icon
menuItem.setIcon(R.drawable.menu_item_icon);
6. MenuItem Click Listener
menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem _menuItem) {
[ ... execute click handling, return true if handled ... ]
return true;
}
});
7. Intent
menuItem.setIntent(new Intent(this, MyOtherActivity.class));
Action View
menuItem.setActionView(R.layout.my_action_view).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM|MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
可以在ActionView中加Button等控件:
View myView = menuItem.getActionView();
Button button = (Button)myView.findViewById(R.id.goButton);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO React to the button press. }
});
从Fragment中获取Menu Item:
在Fragment中调用setHasOptionsMenu方法,可以告诉Activity这个Fragment中含有MenuItem,从而使Activity获得并显示这些MenuItem。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
使用XML定义MenuItem
这是目前比较推荐的添加MenuItem的方法,在res/menu中创建XML文件并将MenuItem定义写入此XML:
<menu xmlns:android=”http://schemas.android.com/apk/res/android”>
<item android:id=”@+id/action_item”
android:icon=”@drawable/action_item_icon”
android:title=”@string/action_item_title”
android:showAsAction=”ifRoom”>
</item>
<item android:id=”@+id/action_view_item”
android:icon=”@drawable/action_view_icon”
android:title=”@string/action_view_title”
android:showAsAction=”ifRoom|collapseActionView”
android:actionLayout=”@layout/my_action_view”>
</item>
<item android:id=”@+id/action_provider_item”
android:title=”Share”
android:showAsAction=”always”
android:actionProviderClass=”android.widget.ShareActionProvider”>
</item>
<item android:id=”@+id/item02”
android:checkable=”true”
android:title=”@string/menu_item_two”>
</item>
<item android:id=”@+id/item03”
android:numericShortcut=”3”
android:alphabeticShortcut=”3”
android:title=”@string/menu_item_three”>
</item>
<item android:id=”@+id/item04”
android:title=”@string/submenu_title”>
<menu>
<item android:id=”@+id/item05”
android:title=”@string/submenu_item”>
</item>
</menu>
</item>
</menu>
然后,在onCreateOptionsMenu中创建Menu:
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_menu, menu);
return true;
}
响应Menu选择事件
Activity中所有的Menu事件都是放在onOptionsItemSelected 中一起处理的:
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
// Find which Menu Item has been selected
switch (item.getItemId()) {
// Check for each known Menu Item
case (MENU_ITEM):
[ ... Perform menu handler actions ... ]
return true;
// Return false if you have not handled the Menu Item
default:
return false;
}
}
子菜单和环境菜单
创建子菜单:
SubMenu sub = menu.addSubMenu(0, 0, Menu.NONE, “Submenu”);
sub.setHeaderIcon(R.drawable.icon); sub.setIcon(R.drawable.icon);
MenuItem submenuItem = sub.add(0, 0, Menu.NONE, “Submenu Item”);
使用环境菜单和弹出菜单:
一种方法是重写View中的onCreateContextMenu方法,这样任何包含这个View的Activity都会包含这个上下文菜单。
@Override
public void onCreateContextMenu(ContextMenu menu) {
super.onCreateContextMenu(menu);
menu.add(“ContextMenuItem1”);
}
更常用的方法是重写Activity的onCreateContextMenu方法,然后在onCreate方法中调用.
registerForContextMenu(view):
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EditText view = new EditText(this);
setContentView(view);
registerForContextMenu(view);
} @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle(“Context Menu”);
menu.add(0, Menu.FIRST, Menu.NONE, “Item 1”).setIcon(R.drawable.menu_item);
menu.add(0, Menu.FIRST+1, Menu.NONE, “Item 2”).setCheckable(true);
menu.add(0, Menu.FIRST+2, Menu.NONE, “Item 3”).setShortcut(‘3’, ‘3’);
SubMenu sub = menu.addSubMenu(“Submenu”);sub.add(“Submenu Item”);
}
这样,在registerForContextMenu中注册的View中长按屏幕时,就会出现这个环境菜单。
弹出菜单
创建弹出菜单并绑定到View:
final PopupMenu popupMenu = new PopupMenu(this, myView);
创建弹出菜单并绑定到Button:
final PopupMenu popupMenu = new PopupMenu(this, button);
popupMenu.inflate(R.menu.my_popup_menu);
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case (POPUP_ITEM_1) :
// TODO Handle popup menu clicks.
return true;
default:
return false;
}
}
});
Android 4 学习(20):ActionBar的更多相关文章
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...
- Android开发学习之LauncherActivity开发启动的列表
Android开发学习之LauncherActivity开发启动的列表 创建项目:OtherActivity 项目运行结果: 建立主Activity:OtherActivity.java [jav ...
- Android Animation学习(二) ApiDemos解析:基本Animatiors使用
Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.ObjectAnimator.AnimatorSet ApiDemos中Animation部分是单独 ...
- Android 布局学习之——Layout(布局)具体解释二(常见布局和布局參数)
[Android布局学习系列] 1.Android 布局学习之--Layout(布局)具体解释一 2.Android 布局学习之--Layout(布局)具体解释二(常见布局和布局參数) ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
- Android开发学习之路--UI之简单聊天界面
学了很多的ui的知识,这里就来实现个聊天的界面,首先来实现个layout的xml,代码如下: <?xml version="1.0" encoding="utf-8 ...
- Android开发学习之路--UI之ListView
这里再学习写android的ListView,其实我们都使用过ListView,就像手机的联系人,就是用的ListView了.下面就实现下简单的ListView吧,首先是xml文件中添加相关的代码: ...
- Android开发学习之路--Activity之Intent
窗外再次飘起了小雪,还有1周就过年了,2016年即将到来,来年不知道自己将身处何处,船到桥头自然直吧.还是继续学习吧,上次学习了Activity,那么如果是两个Activity之间,怎么从一个Acti ...
随机推荐
- 类的静态方法@staticmethod
静态方法 @staticmethod 静态方法是定义在类内部的函数,此函数的作用域是类的内部 说明: 静态方法需要使用 @staticmethod装饰器定义 静态方法与普通函数定义相同,不需要传入se ...
- Microsoft Office Powerpoint、Visio 已停止工作解决办法
现象:在使用visio的过程中经常会出现“Microsoft office visio已停止工作”只能将visio关闭:windows可以尝试恢复您的信息并重新启动该程序.office的其他组件不会出 ...
- 求整数A和B的二进制表示中有多少位是不同?
如果有题目要求整数A和B二进制表示中多少位是不同的? 那我们要先考虑一个unsigned类型中变量1的个数?我们可以考虑简单的移位运算,向右移位,我们进行判断如果不是1直接丢掉,使用&运算符即 ...
- Ubuntu和win双系统删除ubuntu开机出错
Ubuntu和win双系统删除ubuntu开机出错问题. 报错error:unknown filesystem. grub rescue>_ 很简单: 进入pe 打开diskgenius 选择你 ...
- BZOJ5196: [Usaco2018 Feb]Taming the Herd(DP暴力)
5196: [Usaco2018 Feb]Taming the Herd Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 78 Solved: 71[ ...
- POJ2987 Firing 【最大权闭合图】
POJ2987 Firing Description You've finally got mad at "the world's most stupid" employees o ...
- python(十二):网络编程之ISO/OSI模型
互联网(Internet)是依据操作系统,在计算机硬件的基础上建立起的通讯机制.它依赖于TCP/IP协议栈. 一.ISO/OSI模型 1.ISO七层模型与OSI五层模型 它们将计算机抽象成了具有层级关 ...
- Thread和Runable实现多线程
分析两种实现多线程的方式:Thread类和Runnable接口 写一个程序,模拟4个售票窗口共同卖100张火车票的程序. 1:使用继承Thread类方式实现(). 2:使用实现Runnable接口方式 ...
- cell的循环利用
方式1 // 1.先根据cell的标识去缓存池中查找可循环利用的cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdent ...
- Python编码规范和Python风格规范
一.原因 1.长期的工作中,发现大多数程序员的代码可读性差 2.不同的程序员之间的协作很重要,代码可读性必须很好 3.版本升级时,要基于源码升级 4.不友好的代码会影响python的执行效率 二.基于 ...