码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-08-12 09:04:11      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:apidemo   display   actionbar   常量运算   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

    }
}

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

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

标签:apidemo   display   actionbar   常量运算   options   

原文地址:http://blog.csdn.net/fishtosky/article/details/47438559

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!