Android Api Demos登顶之路(三十)Display Options

这个demo演示了actionbar的各种布局样式。

activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="5dp" >

        <Button
            android:id="@+id/display_home_as_up"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="DISPLAY_HOME_AS_UP" />

        <Button
            android:id="@+id/display_show_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="DISPLAY_SHOW_HOME" />

        <Button
            android:id="@+id/display_use_loge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="DISPLAY_USE_LOGO" />

        <Button
            android:id="@+id/display_show_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="DISPLAY_SHOW_TITLE" />

        <Button
            android:id="@+id/display_show_custom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="DISPLAY_SHOW_CUSTOM" />

        <Button
            android:id="@+id/navigation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="NAVIGATION" />

        <Button
            android:id="@+id/cycle_custon_view_gravity"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Cycle Custon View Gravity" />

        <Button
            android:id="@+id/toggle_visibility"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Toggle Visibility" />

        <Button
            android:id="@+id/toggle_system_ui"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TOGGLE SYSTEM UI" />
    </LinearLayout>

</ScrollView>

menu_item.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/menu_item"
        android:title="Menu Title"
        android:showAsAction="never"/>

</menu>

custom_view.xml

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

配置文件中添加logo属性

<activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:logo="@drawable/apidemo_androidlogo">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

MainActivity

@SuppressWarnings("deprecation")
public class MainActivity extends Activity implements OnClickListener,
        TabListener {
    private View mCustomView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.display_home_as_up).setOnClickListener(this);
        findViewById(R.id.display_show_home).setOnClickListener(this);
        findViewById(R.id.display_show_custom).setOnClickListener(this);
        findViewById(R.id.display_show_title).setOnClickListener(this);
        findViewById(R.id.display_use_loge).setOnClickListener(this);
        findViewById(R.id.navigation).setOnClickListener(this);
        findViewById(R.id.cycle_custon_view_gravity).setOnClickListener(this);
        findViewById(R.id.toggle_visibility).setOnClickListener(this);
        findViewById(R.id.toggle_system_ui).setOnClickListener(this);

        mCustomView = getLayoutInflater().inflate(R.layout.custom_view, null);
        ActionBar bar = getActionBar();
        // 向actionbar中添加自定义视图
        bar.setCustomView(mCustomView);
        // 向actionbar中添加导航标签
        bar.addTab(bar.newTab().setText("TAB 1").setTabListener(this));
        bar.addTab(bar.newTab().setText("TAB 2").setTabListener(this));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_item, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        int flag = 0;
        ActionBar bar = getActionBar();
        switch (v.getId()) {
        case R.id.display_home_as_up:
            //显示向上的箭头
            flag = ActionBar.DISPLAY_HOME_AS_UP;
            break;
        case R.id.display_show_home:
            //显示icon
            flag = ActionBar.DISPLAY_SHOW_HOME;
            break;
        case R.id.display_show_custom:
            //显示自定义View
            flag = ActionBar.DISPLAY_SHOW_CUSTOM;
            break;
        case R.id.display_show_title:
            flag = ActionBar.DISPLAY_SHOW_TITLE;
            break;
        case R.id.display_use_loge:
            flag = ActionBar.DISPLAY_USE_LOGO;
            break;
        case R.id.navigation:
            bar.setNavigationMode(bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_STANDARD ? ActionBar.NAVIGATION_MODE_TABS
                    : ActionBar.NAVIGATION_MODE_STANDARD);
            break;
        case R.id.cycle_custon_view_gravity:
            ActionBar.LayoutParams lp = (LayoutParams) mCustomView
                    .getLayoutParams();
            int newGravity = 0;
            /**
             * 1.如果两个数都是奇数进行按位与(&)运算结果就是较小的奇数
             * 2.如果两个数都是奇数进行按位或(|)运算结果就是较大的奇数
             * 3.对奇数进行按位取反(~)运算得到的是偶数
             * 4.奇数与偶数进行&运算结果恒为0
             * 我们可以观察这里的Gravity的几个常量都是奇数而且Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK
             * 值最大
             */
            switch (lp.gravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) {
            case Gravity.START:
                newGravity = Gravity.CENTER_HORIZONTAL;
                break;
            case Gravity.CENTER_HORIZONTAL:
                newGravity = Gravity.END;
                break;
            case Gravity.END:
                newGravity = Gravity.START;
                break;
            }
            /*
             * lp.gravity & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK的结果恒为0
             * 0| newGravity结果恒为newGravity。所以这里进行了复杂的运算其实就是相当于
             * lp.gravity=newGravity;
             */
            /*lp.gravity = lp.gravity & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK
                    | newGravity;*/
            lp.gravity=newGravity;
            bar.setCustomView(mCustomView, lp);
            break;
        case R.id.toggle_visibility:
            if (bar.isShowing()) {
                bar.hide();
            } else {
                bar.show();
            }
            break;
        case R.id.toggle_system_ui:
            if ((getWindow().getDecorView().getSystemUiVisibility() & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0) {
                getWindow().getDecorView().setSystemUiVisibility(0);
            }else{
                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
            }
            break;
        }
        /*
         * 1.当在配置文件中为activity设置了android:logo属性时, logo会代替icon出现在actionbar的左侧。
         * 2.如果要单独显示logo必须DISPLAY_USE_LOGO与DISPLAY_SHOW_HOME同时设置为true。
         * 3.默认情况下actionbar的显示布局为DISPLAY_SHOW_TITLE(值为8)、DISPLAY_SHOW_HOME(值为2)
         * DISPLAY_USE_LOGO(值为1),相当于bar.setDisplayOptions(
         * DISPLAY_SHOW_TITLE|DISPLAY_SHOW_HOME|DISPLAY_USE_LOGO)。
         * 我们知道^(异或)的特点一是相当于半加运算(不带进位的加法运算)二是a^b=c,c^b=a(即经过两次
         * 异或运算又回到原来的值)。
         * 所以在默认情况下我们使用bar.getDisplayOptions()得到的值是11即由8^2^1得到,也就是我们
         * 将TITLE、HOME、LOGO三个常量置为true的结果。
         * 4.setDisplayOptions(change, flag);方法只有当change与flag中同时包含某一常量时
         * 该常量才会在actionbar中显示。
         * 5.默认状态下bar.getDisplayOptions()的值为11包含三个常量,如果flag为DISPLAY_HOME_AS_UP
         * 则change的值为15,则此时chang当中就包含了四个常量
         * DISPLAY_SHOW_TITLE|DISPLAY_SHOW_HOME|DISPLAY_USE_LOGO|DISPLAY_HOME_AS_UP
         * 当执行bar.setDisplayOptions(change, flag);时因为change和flag中同时包含了DISPLAY_HOME_AS_UP
         * 所以DISPLAY_HOME_AS_UP会显示,而其余依旧保持默认状态。
         * 当再次点击按钮再次执行change = bar.getDisplayOptions() ^ flag;由于是第二次异或
         * 相当于将DISPLAY_HOME_AS_UP从change中去除了,所以此时长change中就只有三个常量了
         * DISPLAY_SHOW_TITLE|DISPLAY_SHOW_HOME|DISPLAY_USE_LOGO,再执行
         * bar.setDisplayOptions(change, flag)由于只有flag中有DISPLAY_HOME_AS_UP
         * 就会将DISPLAY_HOME_AS_UP隐藏了。其余按钮运算结果也是一样的。
         */
        int change = bar.getDisplayOptions() ^ flag;
        /*
         * System.out.println("options:"+bar.getDisplayOptions());
         * System.out.println("flag:"+flag);
         * System.out.println("change:"+change);
         */
        // System.out.println("~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK:"+(Gravity.END
        // & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK ));
        // System.out.println("~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK:"+(Gravity.START
        // & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK ));
        // System.out.println("~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK:"+(Gravity.CENTER_HORIZONTAL
        // & ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK ));
        // System.out.println("DISPLAY_SHOW_TITLE:"+ActionBar.DISPLAY_SHOW_TITLE);
        bar.setDisplayOptions(change, flag);
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 08:28:18

Android Api Demos登顶之路(三十)Display Options的相关文章

Android Api Demos登顶之路(十四)Quick Contacts

这个demeo主要演示的是使内容提供者和内容解析者来获取其它应用的数据.Content Provider为不同应用之间共享数据提供了统一的接口,Android系统的每个Content Provider都定义了一个CONTENT_URI,Android中每个Context对象(如Activity)对含有一个ContentResolver,ContentResolver可以根据CONTENT_URI获取对应的Content Provider. 在本例中使用了startManagingCursor(c

Android Api Demos登顶之路(四十)Fragment--&gt;Layout

这个demo演示了fragment的布局特点.本例中在竖屏的状态下,当我们点击列表的条目时 打一个activity来显示这个条目的详细信息. * 而在横屏的状态下由于屏幕足够宽,我们就在界面上同时显示了两个fragment,一个用来 显示标题,另一个用来显示详细信息. layout目录下创建竖屏显示的布局文件:fragment_layout.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayou

Android Api Demos登顶之路(四十五)Loader--&amp;gt;Cursor

这个demo演示了类载入器的用法.关于类载入器的使用我们在前面的demo中已经介绍过了 在此再小小的复习一下. 类载入器的使用步骤: * 1.获取类载入器的管理者LoaderManager manager = tent.getLoaderManager(); * 2.初始化loader MainActivity public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedIn

Android Api Demos登顶之路(五十二)Search

android 为所有需要提供查询功能的activity提供了两种查询方式:search dialog 和searchview * 这个demo演示了第一种查询方式. * 基本思路:用户提交查询后,Android系统构造一个Intent并把用户的查询内容放在这个Intent中.然后Android启动你定义的用来处理用户查询的Activity(称为Searchable Activity),并把这个Intent发给该Activity. * 使用SearchDialog的步骤 * 1.在res/xml

Android Api Demos登顶之路(四十七)Loader--&gt;Throttle

这个demo演示了如何利用类加载器对自定义的内容提供者共享的数据进行管理 MainActivity public class MainActivity extends Activity { // 定义主机名,用以拼接Uri,Uri表明了内容提供的地址,外部应用通过Uri访问内容提供者,来实现对数据的增删改查 private static final String AUTHORITY = "com.fishtosky.loaderthrottle"; /* * 本例中我们将自定义的一个数

Android API Demos 系列之 — 播放GIF动画的类Movie

良好的开端,是成功的一半.A good beginning is half done.  -_- 本文目录 ● 一.什么是GIF ● 二.Android系统和应用如何播放GIF 一.[什么是GIF] Gif动态图片,是通过对多图层的图片,按时间进行不同的切换,以达到动画的效果.Gif动态图片的特点是,图片小,易于随时安置调用.比起一张单调的静态图片,Gif格式的动态图片明显更加的生动和有意思. 二.[Android系统和应用如何播放GIF] 在Android系统的原生控件ImageView并不支

【Android API Guides 简译(三)】Data Storage--Storage Options

Android提供了几种永久储存手机数据的选项,而我们选择存储的方式依据于我们存储的不同的特定需求,比如你的数据是否需要只对自己公开,数据是否可以被其他应用得到或者你想要储存多大的数据. 数据存储的方式如下: Shared Preferences 通过xml类型的键值对,存储私密的原始数据. Internal Storage 内部存储 通过手机内存存储私密数据 External Storage 外部存储 在设备外部共享里存储公开的数据 SQLite Databases Android 原生内部数

测开之路三十五:css引入

CSS是一种定义样式结构,如字体.颜色.位置等的语言,被用于描述网页上的信息格式化和现实的方式.CSS样式可以直接存储于HTML网页或者单独的样式单文件.无论哪一种方式,样式单包含将样式应用到指定类型的元素的规则.外部使用时,样式单规则被放置在一个带有文件扩展名css的外部样式单文档中. css引入方式: 1.div标签 2.style标签,在head里面声明给某一个标签加样式,如果body里面的改标签没有特别声明样式,将全部展示为同一声明的样式,类似于继承与重写的关系 3.link标签:外链导

测开之路三十六:常用的css选择器

在static下新建一个css,并写入内容 /*标签选择器,label标签的颜色为红色*/label {color: red;} /*.代表类选择器,绿色*/.test {color: green;} /*#代表id选择器,黄色*/#test {color: yellow;} /*div标签下的魔偶写标签下的lable标签(相对关系),内容的颜色为蓝色*/div label {color: blue;} /*div标签下的直接的lable标签(父子关系),,灰色*/div > label {co