zoukankan      html  css  js  c++  java
  • Android控件ActionBar浅析及适配2.x的方法介绍

    概述:

      在Honeycomb版本系统中,Android引入了全新的操作栏。操作栏不仅取代了显示标题和应用图标的传统标题栏(title bar),还带来了更多其他的功能,例如,安置菜单选项、配置应用图标作为导航按钮,等等。——《Android编程权威指南》


    优点:

    1.使用方便,避免开发者重复制造轮子。

    2.框架成熟,不需要开发者再去做多余的适配不同分辨率及碎片化优化操作。


    正常使用(API14及以上):

    代码及思路分析:

    正常情况下的我们是通过Java代码和xml代码组合来编写actionbar。

    xml文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <item
            android:id="@+id/action_compose"
            android:icon="@drawable/delete_button_normal"
            android:showAsAction="always"
            android:title="@string/action_compose"/>
        
        <item
            android:id="@+id/action_delete"
            android:icon="@drawable/delete_button_normal"
            android:showAsAction="always"
            android:title="@string/action_delete"/>
        
        <item
            android:id="@+id/action_settings"
            android:icon="@drawable/delete_button_normal"
            android:showAsAction="always"
            android:title="@string/action_settings"/>
    
    </menu>
    定义3个item,设置其showAsAction属性为always.

    关于showAsAction属性的值有以下几个:

    always:    这个值会使菜单项一直显示在Action Bar上
    ifRoom:    如果有足够的空间,这个值会使菜单项显示在Action Bar上
    never:     这个值使菜单项永远都不出现在Action Bar上
    withText:  这个值使菜单项和它的图标,菜单文本一起显示


    看到上面的标签为menu,就应该知道了,到上面在java代码中是通过菜单来实现了。主要的方法是onCreateOptionsMenu,如下:

    public boolean onCreateOptionsMenu(Menu menu) {
    		MenuInflater inflater = getMenuInflater();
    		inflater.inflate(R.menu.menu, menu);
    		return true;
    	}

    为了去响应左边的返回键(箭头)和Home需要我们在代码做以下逻辑:

    ActionBar bar = getActionBar();
    bar.setHomeButtonEnabled(true);
    bar.setDisplayHomeAsUpEnabled(false);
    bar.setDisplayShowHomeEnabled(true);

    还有一点就是Home的图标,我们可以在manifest的activity标签中去设置,如下:

    <activity
                android:name="com.actionbar.activity.MainActivity"
                android:label="@string/action_bar_title"
                android:logo="@drawable/back_button_normal" >
                
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>


    实现效果展示:



    注:有时候我们在屏幕足够大的时候还是会在最左侧出现一个小箭头,那么如何除掉Actionbar最左侧的箭头呢?可以点击这里查看解决方法。


    适配2.x版本:

    代码及思路分析:

      对于上面的逻辑方法只是可以在API 14及以上的系统上实现。那么API 14以下的系统要怎么去实现同样的效果呢?在官方出台新的解决方案之前,就有一些大神开始研究且开发出了一套框架——ActionBarSherlock。当然目前Google已经就这个问题提供了一个新的解决方案——android-support-v7-appcompat。我们可以让我们的Activity继承自ActionBarActivity,不过不担心这个ActionBarActivity会对代码有没有什么不良的影响,因为它是继承自FragmentActivity。


      那么要怎么实现呢?我们需要引入一个工具包:android-support-v7-appcompat,并在Android的项目中导入它。是不是到这里就已经大功告成了呢?运行程序后,我们发现并非如此。可是,在基有的代码上我们没有发现任何蛛丝马迹,那我们要怎么去修改这个Bug呢?google吧,孩子。


      后来我们发现我们不能再使用静态的xml代码来创建它了。我们只能动态的在Java代码中通过Java代码动态生成Item,如下:

    public boolean onCreateOptionsMenu(Menu menu) {
    //		MenuInflater inflater = getMenuInflater();
    //		inflater.inflate(R.menu.menu, menu);
    //		return super.onCreateOptionsMenu(menu);
    		
    		MenuCompat.setShowAsAction(menu.add("First").setIcon(android.R.drawable.btn_star), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
    		MenuCompat.setShowAsAction(menu.add("Second").setIcon(android.R.drawable.ic_menu_rotate), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
    		return true;
    	}
    注释掉的部分就是通过xml静态地创建,事实证明是失败的,需要动态来创建。

    运行效果图展示:



    本人文笔拙劣,可能会有一些表述不够清晰。更详细的代码和细节请在下面的源码连接中去下载查看。还有一点需要注意,如果你的测试机是魅族系列,可能有些地方不能很好适配,请更换测试机重新测试或将属性参数改为SHOW_AS_ACTION_ALWAYS(我用的也是魅族)。


    源码下载:

    http://download.csdn.net/detail/u013761665/8737119

  • 相关阅读:
    Python格式符号
    Python基础知识
    HDFS 数据流程
    HDFS IO流操作
    HDFS API操作
    Hadoop 客户端环境准备
    Hadop 环境搭建 windows10+hadoop2.7.7
    Hadoop HDFS shell
    Hadoop HDFS 基础
    centos 更改清华源
  • 原文地址:https://www.cnblogs.com/fengju/p/6336085.html
Copyright © 2011-2022 走看看