Android ActionBar 使用详解

ActionBar取代了以前的TitleBar,是一种更加灵活的人机交互方式;
ActionBar并不是完全自立门户的一个新兴的东西,而是和3.0以下版本的menu进行了合并整合;
so,添加actionbar的方式肯定和添加menu方式类似;

1.常见普通ActionBar
先来看一个menu的xml配置

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_settings"
        android:showAsAction="always|collapseActionView"
        android:title="settings"/>
</menu>

其中,showAsAction是一个枚举类型的值,有5个取值;

  • never:不显示在actionBar上,只有通过menu菜单才能呼出此菜单项;
  • ifroom:如果actionBar上有足够的空间则显示;
  • always:总是显示;
  • collapseActionView:为了解决空间的问题,收缩ActionView;
  • withText:显示文字;

注:它们之间可以配合使用;

2.上下分开的独立的ActionBar
实现这样的功能其实只需要一句代码:

android:uiOptions="splitActionBarWhenNarrow"

将这段代码放置到清单配置文件的对应的activity里面即可

3.可扩展的ActionBar(搜索框)

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_query"
        android:actionLayout="@layout/al"
        android:showAsAction="always|collapseActionView"
        android:title="query"/>
</menu>

al.xml

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</EditText>

注意在menuitem里面配置的android:actionLayout属性,他代表当点击item的时候需要显示的view;也可通过android:actionViewClass属性指定;
这里再介绍几个相关的方法
》》监听actionView的展开与关闭事件

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        for (int i = 0; i < menu.size(); i++) {
            menu.getItem(i).setOnActionExpandListener(
                    new OnActionExpandListener() {

                        @Override
                        public boolean onMenuItemActionExpand(MenuItem arg0) {
                            Log.e("tag", "onMenuItemActionExpand");
                            return true;
                        }

                        @Override
                        public boolean onMenuItemActionCollapse(MenuItem arg0) {
                            Log.e("tag", "onMenuItemActionCollapse");
                            return true;
                        }
                    });
        }
        return super.onCreateOptionsMenu(menu);
    }

4.Tab样式ActionBar

添加实现代码

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab);
        mActionBar = getActionBar();
        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        mActionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME);
        ActionBar.Tab tabA = mActionBar.newTab().setText("ATab");
        ActionBar.Tab tabB = mActionBar.newTab().setText("BTab");
        tabA.setTabListener(new MyTabsListener(new AFragment()));
        tabB.setTabListener(new MyTabsListener(new BFragment()));
        mActionBar.addTab(tabA, 0);
        mActionBar.addTab(tabB, 1);
        mActionBar.setSelectedNavigationItem(1);
    }

MyTabsListener.java(监听tab)改变事件

    protected class MyTabsListener implements ActionBar.TabListener {
        private Fragment frag;

        public MyTabsListener(Fragment frag) {
            super();
            this.frag = frag;
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft.replace(R.id.framel, frag);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
        }
    }

5.ActionMode
还有一种很常见的ActionBar,就是选择了一些数据之后(如一下列表中的某些项,删除等动作),弹出ActionBar让用户选择需要的操作;

            ActionMode am = startActionMode(new Callback() {
                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                    Log.e("tag", "onPrepareActionMode");
                    menu.findItem(R.id.action_settings).setVisible(false);
                    return true;
                }

                @Override
                public void onDestroyActionMode(ActionMode mode) {
                    Log.e("tag", "onDestroyActionMode");
                }

                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                    Log.e("tag", "onCreateActionMode");
                    getMenuInflater().inflate(R.menu.menu1, menu);
                    return true;
                }

                @Override
                public boolean onActionItemClicked(ActionMode mode,
                        MenuItem item) {
                    Log.e("tag", "onActionItemClicked");
                    if (item.getItemId() == R.id.action_settings1) {
                        am.finish();
                    }
                    return false;
                }
            });

在onPrepareActionMode中,我们也可以根据需要控制菜单项的显示;其它的一些点击事件等等和前面讲的ActionBar的操作相同;
这里需要注意的是ActionMode在finish之后,不能再次调用,否则会引发异常;

 

6。。。未完待续

http://blog.csdn.net/liu149339750/article/details/8282471

posted @ 2014-05-07 22:01  Livingstone  阅读(878)  评论(0编辑  收藏  举报