ActionBar框架

来源:互联网 发布:u盘0字节怎么找回数据 编辑:程序博客网 时间:2024/05/16 11:19


如何才能真正进阶为Android应用开发高手?必须深入理解Android核心技术的底层原理和在开发中总结并使用各种最佳实践,别无他法!本书以Android的源代码为主,SDK为辅,针对应用开发者的需求,对各种核心技术的使...  立即去当当网订购

为了进一步增加有效显示区域,在Honeycomb中引入了ActionBar框架。ActionBar取代了状态栏和标题栏的位置,可以帮助开发者尽可能地利用空间。ActionBar的布局如图1-11所示。


 

Action项的执行和普通菜单一样,也是通过onOptionsItemSelected()方法进行的。

另外,考虑到Honeycomb进一步简化了对按键的依赖,在ActionBar中还引入了一个新功能,即通过setDisplayHomeAsUpEnabled()方法可以激活ActionBar中应用图标对单击事件的响应,相应方法如下:
actionBar.setDisplayHomeAsUpEnabled(true);

通过ActionBar还可以设置自定义的视图,即ActionView,其本质上是菜单的一种实现。

在ActionBar中,应用图标对单击事件的响应也是通过onOptionsItemSelected()方法进行的,其对应的ID为android.R.id.home。ActionBar通常需要和Fragment交互。

1. 隐藏ActionBar

隐藏ActionBar可以通过配置文件和Java代码两种方式实现,开发者可以根据场景的不同应用不同的方式。

注意 如果已经移去了ActionBar,当调用getActionBar()方法时会返回NULL。

(1)通过配置文件隐藏ActionBar

通过Androidmanifest.xml设置Activity的theme属性可以隐藏ActionBar,方法如下:
<activity android:theme="@android:style/Theme.Holo.NoActionBar">

(2)通过Java代码隐藏ActionBar

当需要动态地隐藏ActionBar时,只能通过Java代码的方式实现,方法如下:
ActionBar actionBar = getActionBar();
actionBar.hide();

重新显示ActionBar的方法为:
actionBar.show();

2. Action项管理

Action项本质上是一种特殊的菜单项,由图标和文字两部分组成。考虑到用户体验,在实际开发时,不建议设置超过2个的Action项。Action项有4种属性可以配置,分别如下:
SHOW_AS_ACTION_ALWAYS //总是作为Action项显示
SHOW_AS_ACTION_IF_ROOM //空间足够时显示
SHOW_AS_ACTION_NEVER //永远不作为Action项显示
SHOW_AS_ACTION_WITH_TEXT //显示Action项的文字部分

(1)利用配置文件配置Action项

Action项在菜单配置文件中的配置和普通菜单项的区别在于需要设置showAsAction属性,示例如下:
<?xml version="1.0" encoding="utf-8"?>
< menu xmlns:android="http://schemas.android.com/apk/res/android">
< item android:id="@+id/menu_save"
android:icon="@drawable/ic_menu_save"
android:title="@string/menu_save"
android:showAsAction="ifRoom|withText" />
< /menu>

(2)利用Java代码配置Action项

利用Java代码配置Action项主要是通过setShowAsAction()方法进行的,示例如下:
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
  menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
  menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}

3. ActionView

ActionView即所谓的在ActionBar上出现的Widget,用于实现一些快捷的操作,并充分利用ActionBar的空间。ActionView的实现有两种方式:加载布局文件和加载视图类。

无论是加载布局文件还是加载视图类,均可通过配置文件实现。下面是加载布局文件的示例:
<?xml version="1.0" encoding="utf-8"?>
< menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@+id/menu_search"
android:title="Search"
android:icon="@drawable/ic_menu_search"
android:showAsAction="ifRoom"
android:actionLayout="@layout/searchview" />
< /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:title="Search"
android:icon="@drawable/ic_menu_search"
android:showAsAction="ifRoom"
android:actionViewClass="android.widget.SearchView" />
< /menu>

为了操作ActionView,必须首先获得相应视图的句柄,相应方法如下:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
// 对searchView进行操作
...
 return super.onCreateOptionsMenu(menu);
}

4. 添加Tab页

ActionBar可以显示Tab页,在Activity中进行Fragment间切换。每个Tab可以包含的元素有标题和图标,类似于TabWidget。向ActionBar中添加Tab页的步骤为:

(a)创建ActionBar.TabListener,并实现其方法。

(b)设置ActionBar的导航模式为NAVIGATION_MODE_TABS。

(c)创建Tab页。

(d)添加Tab页。

下面是设置导航模式,创建并添加Tab页的示例:
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.main);
  // 获得ActionBar句柄
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// 创建Fragment
Fragment artistsFragment = new ArtistsFragment();
//创建并添加Tab页,以及设置TabListener
actionBar.addTab(actionBar.newTab().setText(R.string.tab_artists) .setTabListener(new TabListener(artistsFragment)));
// 创建Fragment
Fragment albumsFragment = new AlbumsFragment();
//创建并添加Tab页,以及设置TabListener
actionBar.addTab(actionBar.newTab().setText(R.string.tab_albums) .setTabListener(new TabListener(albumsFragment)));
}

为了监听Tab的选择变化,创建TabListener并实现其方法的示例如下:
private class MyTabListener implements ActionBar.TabListener {
         private TabContentFragment mFragment;
public MyTabListener(TabContentFragment fragment) {
mFragment = fragment;
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(R.id.fragment_content, mFragment, null);
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(mFragment);
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
       ...
    }
}

注意 在导航模式下Tab页的实现和TabActivity的实现有很大的区别,虽然两者切换Tab均是基于FrameLayout实现的,但前者需要开发者做更多的工作。

通过ActionBar 的getSelectedNavigationIndex ()方法和getSelectedTab ()方法可以获知当前选中的是哪个Tab页。

5. 下拉菜单

基于ActionBar还能实现下拉菜单的功能。下拉菜单主要是基于SpinnerAdapter来处理数据的。实现下拉菜单的步骤如下:

(a)设置导航模式;

(b)实现并加载资源文件;

(c)创建并设置OnNavigationListener。

设置导航模式的方法很简单,调用setNavigationMode()方法将导航模式设置为NAVIGATION_MODE_LIST即可,具体方法如下:
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

资源的实现方式有数组和资源文件等两种,下面是资源文件方式的实现的示例:
<?xml version="1.0" encoding="utf-8"?>
< resources>
< string-array name="action_list">
< item>Mercury</item>
< item>Venus</item>
< item>Earth</item>
< /string-array>
< /resources>

加载资源文件的方法如下:
SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list,
android.R.layout.simple_spinner_dropdown_item);

为了监听用户的选择,需要创建并设置OnNavigationListener。创建OnNavigationListener的方法如下:
mOnNavigationListener = new OnNavigationListener() {
// 获得ArrayAdapter需要的字符串数组
  String[] strings = getResources().getStringArray(R.array.action_list);
 @Override//监听用户的选择
 public boolean onNavigationItemSelected(int position, long itemId) {
    ...
    return true;
  }
};

设置OnNavigationListener是通过setListNavigationCallbacks()方法实现的,示例如下:
actionBar.setListNavigationCallbacks(mSpinnerAdapter, mOnNavigationListener);

0 0
原创粉丝点击