ActionBar用法概述

ActionBar:
1. 定义:
android3.0之后引入的,是一个导航控件,用以代替传统屏幕顶端的标题栏。要兼容低版本使用support library v7中ActionBar就可以了
ActionBar显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项
存在的目的:
在不同的应用程序之间提供一致的导航和视觉体验
突出Activity的关键操作(如“搜索”、“创建”、“共享”等),并且在可预见的方法内给用户提供快捷的访问
注:android5.0之后抛弃了ActionBar,用toolBar代替了

2.ActionBar的主题Theme:
在清单文件中activity的theme属性设置:
android:theme=”@android:style/Theme.Dialog” 让当前Activity启动时以对话框的形式启动
android:theme=”@android:style/Theme.Light.NoTitleBar” 没有标题栏的白色主题
android:theme=”@android:style/Theme.NoTitleBar” 没有标题栏的黑色主题
android:theme=”@android:style/Theme.Light.NoTitleBar.Fullscreen” 以全屏显示,没有标题栏,也没有状态栏
android:theme=”@android:style/Theme.Translucent” 让当前Activity以透明背景的形式显示,但透明背景下上面的控件依然可用
ndroid:theme=”@android:style/Theme.Holo” 导航栏和主页面都全黑

3.ActionBar的使用:
A:声明ActionBar对象,并通过getActionBar()得到Actionbar对象
在系统包中,通过getActionBar()得到
在V7包下,通过getSupportActionBar()得到
private ActionBar actionBar;
actionBar = getActionBar();

B: 通过ActionBar对象进行操作
常见用法:
actionBar.show();显示ActionBar,将上方整个ActionBar显示
actionBar.hide();隐藏ActionBar,将上方整个ActionBar隐藏
actionBar.setDisplayHomeAsUpEnabled(true);在ActionBar上显示返回图标
备注:在引用主题的地方自定义返回按钮的图:@drawable/?
actionBar.isShowing();返回boolean类型,判断Actionbar的显示状态true–>ActionBar显示,false–>ActionBar隐藏

    Demo:ActionBar的显示与隐藏    
            // 判断当前actionBar的显示状态
            boolean isShowing = this.actionBar.isShowing();// true--》显示,false隐藏
            if (isShowing) {
                // 隐藏
                this.actionBar.hide();
            } else {
                // 显示
                this.actionBar.show();
            }

4.Menu下item属性
id:表示动作项的id,与menu项一致
title:动作项文本
showAsAction的属性:
never:不显示在ActionBar中,只在溢出列表中显示,而且只显示标题,所以在定义item时,最好带上标题,对于有menu按键的手机设备,可以点击menu按键进行查看,
备注:溢出菜单
ifRoom:会显示在item当中,但是如果已经有4个或者4个以上的item时会隐藏在溢出列表中。当然个数不仅局限于4哥,
依据屏幕的宽和窄而定。对于有menu按键的手机设备,可以点击menu按键进行查看
always:一直显示在ActionBar上
withText:显示图标的同时还要显示title文本,如果空间不足就不会显示title,只有当用户长按动作项时会弹出title的Toast,起到提示作用
collapseActionView:折叠效果(一般配合ifRoom一起使用才有效果)

5.SearchView的使用:
A:在menu下的XML中创建item
B:在onCreateOptionsMenu(Menu menu)方法中通过菜单填充器得到菜单
getMenuInflater().inflate(R.menu.main, menu);
C:根据id得到搜索菜单项
MenuItem item_search = menu.findItem(R.id.action_search);
D:得到searchview对象
方式一:SearchView searchView = (SearchView) MenuItemCompat.getActionView(item_search);
方式二:SearchView searchView = (SearchView) item_search.getActionView();
注意:有的时候为了避免空指针必须用第一种方式。
E:设置监听:
searchView.setOnQueryTextListener(new OnQueryTextListener() {
//当用户按确认键或者回车键的时候调用
public boolean onQueryTextSubmit(String query) {}
//当输入文本发生变化的时候调用
public boolean onQueryTextChange(String newText) {}
});

5.ActionBar的分类以及使用

5.1 带有返回箭头的ActionBar
使用步骤:
A:声明ActionBar,并通过getActionBar()/getActionSupportBar()得到ActionBar对象
private ActionBar actionBar;
this.actionBar = this.getActionBar();
B: 通过设置属性将箭头显示,
actionBar.setDisplayHomeAsUpEnabled(true);
C:给箭头加监听;
ActionBar显示在菜单中,onOptionsItemSelected(MenuItem item) 方法为菜单的监听事件。
注意:ActionBar返回箭头对应的id为 abdroid.R.id.home;
int id = item.getItemId();
switch (id) {
// ActionBar的返回图标对应的id
case android.R.id.home:
this.finish();//结束当前的Activity
break;}

这样当跳转到其他Activity的时候,点击返回箭头就能返回到上一个Activity
D:当在另一个Activity中记得设置ActionBar 的箭头显示
ActionBar actionBar = this.getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

5.2 显示隐藏的Actionbar android:actionLayout=”“:
isActionViewExpanded();判断是否折叠的状态
collapseActionView();折叠
expandActionView();展开

A: item的布局:注意showAsAction的属性

<item
            android:id="@+id/action_layout"
            android:orderInCategory="100"
            android:showAsAction="ifRoom|collapseActionView"
            android:actionLayout="@layout/customer_item"
            android:title="ActionLayout"/>

B:声明ActionBar,并通过getActionBar()/getActionSupportBar()得到ActionBar对象
private ActionBar actionBar;
this.actionBar = this.getActionBar();
C:菜单选项在onCreateOptionsMenu(Menu menu)中,通过布局填充器得到菜单项,并通过menu得到每条item,
通过getActionView()得到自定义的布局对象。


        getMenuInflater().inflate(R.menu.main, menu);
        menuItem = menu.findItem(R.id.action_layout);
        View view = menuItem.getActionView();//可对布局对象进行操作

D:通过MenuItemCompat.setOnActionExpandListener()设置监听 ,将每条item传入。

MenuItemCompat.setOnActionExpandListener(menuItem,
                new OnActionExpandListener() {
                    /**
                     * 当ActionLayout展开的时候自动调用的方法
                     */

                    public boolean onMenuItemActionExpand(MenuItem arg0) {
                        // 必须返回true,否则无法展开布局对象
                        return true;
                    }
                    /**
                     * 当ActionLayout折叠的时候自动调用的方法
                     */
                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem arg0) {
                        // 必须返回true,否则无法折叠布局对象
                        return true;
                    }
                });

5.3 分享的Actionbar android:actionProviderClass=””
A:在menu下设置item,

      Intent intent = new Intent(Intent.ACTION_SEND);
        intent.putExtra(Intent.EXTRA_TEXT, "歌唱祖国");
        intent.setType("text/plain");
        shareActionProvider.setShareIntent(intent);

5.4 ActionBar的选项卡模式
ActionBar的导航模式:通过actionBar.setNavigationMode()设置
ActionBar.NAVIGATION_MODE_STANDARD ; 标准模式,默认值,使用菜单文件生成的菜单
Actionbar.NAVIGATION_MODE_TABS ; 选项卡模式,需要手工添加选项卡
Actionbar.NAVIGATION_MODE_LIST ; 列表模式
使用步骤:
A:声明ActionBar,并通过getActionBar()/getActionSupportBar()得到ActionBar对象
private ActionBar actionBar;
this.actionBar = this.getActionBar();
B:设置ActionBar的导航模式为选项卡模式:
this.actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
C:使用actionBar.newTab()方法得到选项卡对象,并设置
ActionBar.Tab tab_file = this.actionBar.newTab();
tab_file.setText(“文件”);//设置选项卡标题
tab_file.setIcon(R.drawable.ic_launcher);//设置图片
D:将生成的选项卡对象添加到ActionBar上面
this.actionBar.addTab(tab_file,true);//后面设置为true则是进入后默认显示,不写则不是
E:设置监听.setTabListener()实现TabListener接口;重写三个方法
(在这里因为有很多选项卡所以使用内部类实现ActionBar.TabListener接口方式比较简便)
this.actionBar.setTabListener(myTabListener);
代码:

    private final class MyTabListener implements ActionBar.TabListener{
                /**
                 * 当选项卡处于选中状态调用的方法
                 * tab:选项卡对象
                 *      方法:tab.getText()-->得到选项卡的内容
                 *            tab.getPosition()-->得到选项卡的位置
                 * ft : 碎片事务对象,需要注意:这个事务对象不需要手工提交,即不用ft.commit()
                 */
                @Override
                public void onTabSelected(Tab tab, FragmentTransaction ft) {

                }
                /**
                 * 当选项卡失去选中状态调用的方法
                 * tab:选项卡对象
                 * ft : 碎片事务对象,需要注意:这个事务对象不需要手工提交,即不用ft.commit()
                 */
                @Override
                public void onTabUnselected(Tab tab, FragmentTransaction ft) {

                }
                /**
                 * 当选项卡处于选中状态,用户继续点击这个选项卡的时候调用的方法
                 * tab:选项卡对象
                 * ft : 碎片事务对象,需要注意:这个事务对象不需要手工提交,即不用ft.commit()
                 */
                @Override
                public void onTabReselected(Tab tab, FragmentTransaction ft) {

                }               
            }

Demo:ActionBar Tab 与fragment一起使用
在监听的onTabSelected方法中:

public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
            MyFragment fragment = new MyFragment();
            Bundle bundle = new Bundle();
            //得到当前选项卡的内容
//          bundle.putString("info", tab.getText().toString());
            //得到当前选项卡的索引位,从0开始
            bundle.putInt("position", tab.getPosition());

            fragment.setArguments(bundle);
            ft.replace(R.id.linear, fragment);
        }
在Fragment的onCreateView()方法中:
    View view = inflater.inflate(R.layout.activity_fragment, null);
        text = (TextView) view.findViewById(R.id.textView1);
        // 得到当前选项卡的索引位、
        int positing = bundle.getInt("position");
        switch (positing) {
        case 0:
            text.setText("傻");
            break;
        case 1:
            text.setText("白");
            break;
        case 2:
            text.setText("甜");
            break;
        }
        return view;

5.5 ActionBar的列表模式
使用步骤:
A:声明ActionBar,并通过getActionBar()/getActionSupportBar()得到ActionBar对象
private ActionBar actionBar;
this.actionBar = this.getActionBar();
B: 设置导航模式为列表模式:
this.actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
C:通过.setListNavigationCallbacks()方法设置监听
this.actionBar.setListNavigationCallbacks(adapter, callback);
1)分析发现该监听需要一个SpinnerAdapter adapter,和OnNavigationListener callback
所以列表的item的数据源通过adapter传入。
2)定义适配器,BaseAdapter实现了SpinnerAdapter,ArrayAdapter和SimpleAdapter又是BaseAdapter,所以有多中adapter可选择
填充数据。将适配器传入监听方法中。

设置监听实现方法:

this.actionBar.setListNavigationCallbacks(adapter, new OnNavigationListener() {

                    /**
                     * 当actionBar上的导航条目被选中时自动调用的方法 
                     * itemPosition:当前列表对应的索引位 
                     * itemId:条目id
                     * return:当前事件是否被处理掉了
                     */
                    @Override
                    public boolean onNavigationItemSelected(int itemPosition, long itemId) {

                        return false;
                    }
                });
Demo:与fragment一起使用:
    MainActivity中:
public class MainActivity extends Activity {
            private ActionBar actionBar;
            private ArrayAdapter<String> adapter;
            String[] data = { "文件", "编辑", "查看" };
            private FragmentManager fragmentManager;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                actionBar = getActionBar();
                fragmentManager = this.getFragmentManager();

                // 设置导航模式为列表模式
                this.actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
                this.adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, data);

                this.actionBar.setListNavigationCallbacks(adapter, new OnNavigationListener() {

                    /**
                     * 当actionBar上的导航条目被选中时自动调用的方法 
                     * itemPosition:当前列表对应的索引位 
                     * itemId:条目id
                     * return:当前事件是否被处理掉了
                     */
                    @Override
                    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
                        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

                        ContentFragment c = new ContentFragment();
                        Bundle bundle = new Bundle();
                        bundle.putString("info", data[itemPosition]);
                        bundle.putInt("position", itemPosition);
                        c.setArguments(bundle);
                        fragmentTransaction.replace(R.id.linear_main, c);
                        fragmentTransaction.commit();
                        return false;
                    }
                });
            }

        Fragment中:
            public class ContentFragment extends Fragment {
            private TextView text;

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.activity_fragment, null);
                text = (TextView) view.findViewById(R.id.textView1);

                Bundle bundle = this.getArguments();
                String info = bundle.getString("info");
                int position = bundle.getInt("position");
                // text.setText(info);
                switch (position) {
                case 0:
                    text.setText("哪有文件");
                    break;
                case 1:
                    text.setText("编辑什么");
                    break;
                case 2:
                    text.setText("看什么看");
                    break;

                default:
                    break;
                }
                return view;
            }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值