Android ActionBar学习笔记

一、ActionBar:(动作栏)
(一)、简介:(扩展TitleBar
Action bar(动作栏)是一个导航控件,用以代替传统屏幕顶端的标题栏。ActionBar显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项。类似于windows桌面程序的工具栏。
1、ActionBar主要功能:
Action Bar被认为是新版Android系统中最重要的交互元素,在程序运行中一直置于顶部,主要起到的作用在于:
1) 突出显示一些重要操作(如“注册”、“登录”、“搜索”等)。将平时隐藏的选项菜单显示成活动项ActionItem。
2) 在程序中保持统一的页面导航和切换方式。这种基于Tab的导航方式,可以切换多个Fragment。
3) 提供基于下拉的导航菜单
4) 使用程序logo,作为返回APP的HOME主页面或向上的导航操作。

2、ActionBar分成四个区域:
  • App Icon:可显示APP的icon,也可用其他图标代替。当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航。
  • 视图切换:(效果如下图)
  • Action Buttons:这个放最重要的软件功能,放不下的按钮就自动进入Action overflow了。
  • Action overflow:不常用的操作项目自动进入Action overflow

备注:什么是Action overflow?

对于没有MENU按键的手机,ActionBar会在最后显示一个折叠的图标,点击该图标会显示剩余的选项菜单项。这个折叠的图标功能就是Action overflow。
Action overflow中存放并不会频繁用到的操作。按照官方网页上的说法,“Overflow图标仅显示在没有MENU硬按键的手机上,而对于有MENU键的手机,overflow图标是不显示的,当用户点击MENU按键时弹出。” 事实上Google已经敦促手机厂商及软件开发商取消MENU菜单。也就是以前的Menu将不再使用。

(二)、创建ActionBar:

1、在res目录下创建一个menu目录,在此目录下创建一个XML资源文件来定义menu。同样可以有普通菜单、二级普通菜单、二级可选项菜单。

 <item
        android:id="@+id/menu_about"
        android:orderInCategory="2"
        android:showAsAction="never"    【注意:android:showAsAction的属性值有:never、always、ifRoom、withText、collapseActionView
        android:title="关于"/>
 android:showAsAction属性值的解释:

注意:使用app:showAsAction="always" 并添加 xmlns:app="http://schemas.android.com/apk/res-auto"
  • never : 不将该MenuItem显示在ActionBar上(是默认值)
  • always : 总是将该MenuItem显示在ActionBar上
  • ifRoom : 当AcitonBar位置充裕时将该MenuItem显示在ActionBar上
  • withText : 将该MenuItem显示在ActionBar上,并显示该菜单项的文本
  • collapseActionView : 将该ActionView折叠成普通菜单项。最低API=14
代码中添加menu:
<span style="font-size:14px;">  </span><span style="font-size:18px;"> /**
     * 创建一个选择菜单,系统方法
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //1.在res中创建一个menu文件夹
        //2.创建menu加载器,加载menu菜单
        getMenuInflater().inflate(R.menu.actionbar,menu);
        return super.onCreateOptionsMenu(menu);

    }

    /**
     * 对menu设置监听,系统方法
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home: //最左边返回按键
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
</span>

(三)actionbar相关配置

 1、核心代码如下:
<span style="font-size:14px;">       </span><span style="font-size:18px;"> //1.拿到actionBar对象
        ActionBar actionBar = getSupportActionBar();

        //2.去掉actionBar的title
        actionBar.setDisplayShowTitleEnabled(false);
        //设置actionBar的title
        actionBar.setTitle("首页");
        actionBar.setSubtitle("副标题");

        //3.设置是否使用home,home指的的最左边,显示一个返回按钮
        actionBar.setDisplayHomeAsUpEnabled(true);

        //4.设置显示logo,不仅要设置logo图片,还有设置另外两个属性
        actionBar.setLogo(android.R.drawable.star_on);
        actionBar.setDisplayUseLogoEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);

        //4.隐藏actionBar,但并不是取消,仍然占位
        //如果不想要,可以在theme中设置NoActionBar
//        actionBar.hide();

        //5.actionBar提供了切换fragment的MODE,1,tabs 2,list   Navigation:导航
//        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        //给actionBar的条目导航设置的适配器
        NavigationAdapter adapter = new NavigationAdapter();
        adapter.setmDatas(getNaviData()); //导航条目上显示的数据
        //给actionBar设置条目导航的回调方法,第一个参数为适配器,第二个为导航监听
        actionBar.setListNavigationCallbacks(adapter, new ActionBar.OnNavigationListener() {
            @Override
            public boolean onNavigationItemSelected(int itemPosition, long itemId) {
                Toast.makeText(MainActivity.this,""+itemPosition,Toast.LENGTH_SHORT).show();
                //fragment切换,把点击的导航条目的位置传递过去
                initFragment(itemPosition);
                return false;
            }
        });</span>

2、上面代码中用到的两个方法:
<span style="font-size:14px;">  </span><span style="font-size:18px;"> /**
     * 设置导航条目上显示的内容
     * @return
     */
    private ArrayList<String> getNaviData() {
        ArrayList<String>mDatas = new ArrayList<>();
        mDatas.add("首页");
        mDatas.add("最新");
        mDatas.add("科技");
        mDatas.add("娱乐");
        return mDatas;
    }

    /**
     * 切换fragment
     * @param position
     */
    public void initFragment(int position){
        Fragment fragment = null;
        if (position == 0){
            fragment = MainFragment.newInstance();
        }else if(position == 1){
            fragment = NewsFragment.newInstance();
        }if(fragment == null){  //后面两个没有实现,点击后不做处理
            return;
        }
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fl,fragment);
        fragmentTransaction.commit();
    }</span>

3、fragment对应的适配器:
<span style="font-size:18px;">package com.example.administrator.actionbar;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by Administrator on 2016/9/27.
 */
public class NavigationAdapter extends BaseAdapter{

    private ArrayList<String>mDatas;

    public void setmDatas(ArrayList<String> mDatas) {
        this.mDatas = mDatas;
    }

    @Override
    public int getCount() {
        return mDatas.size();
    }

    @Override
    public Object getItem(int position) {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null){
            convertView = View.inflate(parent.getContext(),R.layout.item_navigation, null);
            
            holder = new ViewHolder();
            holder.tv_navigation = (TextView) convertView.findViewById(R.id.tv_navigation);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        String s = mDatas.get(position);
        holder.tv_navigation.setText(s);
        return convertView;
    }

    class ViewHolder{
        TextView tv_navigation;
    }
}
</span>


(四)、ActionBar保护现场

1、目的:当横竖屏切换时,会让页面重新加载。在tab模式下,如何记住之前的tab索引呢?需要保护现场。

2、核心代码:

@Override
protected void onSaveInstanceState(Bundle outState) {
Log.i(TAG, "==index:" + getActionBar().getSelectedNavigationIndex());
outState.putInt("tabindex", getActionBar().getSelectedNavigationIndex());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
getActionBar().setSelectedNavigationItem(
savedInstanceState.getInt("tabindex"));
}

(五) 创建一个自定义的操作提供器

       当你想要创建一个有动态行为和在悬浮菜单中有默认图标的操作视窗时,继承ActionProvider类来定义这些行为是一个比好的的方案。创建自己的操作提供器,提供一个有组织的可重用的组件,而不是在Fragment或Activity的代码中处理各种操作项的变换和行为。

       要创建自己的操作提供器,只需简单的继承ActionProvider类,并且实现合适的回调方法。你应该实现以下重要的回调方法:

ActionProvider()

        这个构造器把应用程序的Context对象传递个操作提供器,你应该把它保存在一个成员变量中,以便其他的回调方法使用。

OnCreateActionView()

        这是你给菜单项定义操作视窗的地方。使用从构造器中接收的Context对象,获取一个LayoutInflater对象的实例,并且用XML资源来填充操作视窗,然后注册事件监听器。如:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public View onCreateActionView() {  
  2.     // Inflate the action view to be shown on the action bar.  
  3.     LayoutInflater layoutInflater = LayoutInflater.from(mContext);  
  4.     View view = layoutInflater.inflate(R.layout.action_provider, null);  
  5.     ImageButton button = (ImageButton) view.findViewById(R.id.button);  
  6.     button.setOnClickListener(new View.OnClickListener() {  
  7.         @Override  
  8.         public void onClick(View v) {  
  9.             // Do something...  
  10.         }  
  11.     });  
  12.     return view;  
  13. }  

onPerformDefaultAction()
         
在选中悬浮菜单中的菜单时,系统会调用这个方法,并且操作提供器应该这对这个选中的菜单项执行默认的操作。

       但是,如果你的操作提供器提供了一个子菜单,即使是悬浮菜单中一个菜单项的子菜单,那么也要通过onPrepareSubMenu()回调方法来显示子菜单。这样onPerformDefaultAction()在子菜单显示时就不会被调用。

       注意:实现了onOptionsItemSelected()回调方法的Activity或Frament对象能够通过处理item-selected事件(并且返回true)来覆盖操作提供器的默认行为,这种情况下,系统不会调用onPerformDefaultAction()回调方法。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值