• 怎样优雅的管理ActionBar


    转载请标明出处:
    http://blog.csdn.net/hai_qing_xu_kong/article/details/50997095
    本文出自:【顾林海的博客】


    前言

    随着项目越来越大。页面数也对应的添加。每一个页面都须要顶部的ActionBar,假设在每一个xml文件里去include我们的actionbar布局。工作量也是非常大。并且不利于后期维护。

    今天这篇文章是教大家合理的管理我们的actionbar,代码非常easy,主要是一个思路。

    注意看actionbar,效果图:

    actionbar


    管理ActionBar

    为了达到actionbar的统一管理。这里须要获取系统的ActionBar。通过下面方法进行布局的替换:

    public abstract void setCustomView(View view, LayoutParams layoutParams);

    1、先创建我们的actionbar布局。总体布局非常easy。包括左边返回button、左边标题、中间标题和右边标题。详细情况下面common_action_bar.xml文件:

    <?xml version="1.0" encoding="utf-8"?

    > <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="57dp" > <LinearLayout android:id="@+id/ll_common_back" android:layout_width="30dp" android:layout_height="57dp" android:gravity="center_vertical" android:orientation="horizontal" > <ImageView android:id="@+id/iv_common_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:src="@drawable/common_left" /> </LinearLayout> <TextView android:id="@+id/tv_common_left_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_toRightOf="@id/ll_common_back" android:singleLine="true" android:textColor="@android:color/black" android:textSize="16sp" /> <TextView android:id="@+id/tv_common_middle_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:singleLine="true" android:textColor="@android:color/black" android:textSize="16sp" /> <TextView android:id="@+id/tv_common_right_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:singleLine="true" android:textColor="@android:color/black" android:textSize="16sp" /> </RelativeLayout>

    效果图例如以下:

    actionbar效果图

    2、创建完actionbar布局后。我们新建一个继承Activity的BaseActionBarActivity抽象类,获取系统actionbar,进行布局的替换:

            mActionBar = getActionBar();
            if (mActionBar != null) {
                mActionBar.setDisplayShowCustomEnabled(true);
                mActionBar.setDisplayShowTitleEnabled(false);
                mActionBar.setDisplayShowHomeEnabled(false);
                mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
                mActionBar.setBackgroundDrawable(getResources().getDrawable(
                        R.drawable.common_bg));
                initView(mCommonActionBar);
                ActionBar.LayoutParams params = new ActionBar.LayoutParams(
                        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                mActionBar.setCustomView(mCommonActionBar, params);

    mCommonActionBar就是我们前面定义的actionbar布局View。

    3、在BaseActionBarActivity中定义一些方法。用于子类调用,例如以下:

    /**
         * 设置左边的标题
         * 
         * @param leftTitle
         */
        protected void setLeftTitle(String leftTitle) {
            tv_common_left_title.setText(leftTitle);
        }
    
        /**
         * 设置中间标题
         * 
         * @param middleTitle
         */
        protected void setMiddleTitle(String middleTitle) {
            tv_common_middle_title.setText(middleTitle);
        }
    
        /**
         * 设置右边标题
         * 
         * @param rightTitle
         */
        protected void setRightTitle(String rightTitle) {
            tv_common_middle_title.setText(rightTitle);
        }
    
        /**
         * 主页的Actionbar样式
         */
        protected void setMainAction() {
            ll_common_back.setVisibility(View.GONE);
        }
    
        /**
         * 子页面通用样式
         */
        protected void setCommonAction() {
            iv_common_back.setVisibility(View.VISIBLE);
        }

    4、创建我们的点击事件的回调,在BaseActionBarActivity中定义一个抽象方法:

    protected abstract void onClickActionBar(int type);

    方法的详细实现由子类实现,type的值有下面几种:

    protected final int ACTION_LEFT = 0x01;// 左边标题点击
    protected final int ACTION_MIDDLE = 0x02;// 中间标题点击
    protected final int ACTION_RIGHT = 0x03;// 右边标题点击

    最后注冊点击事件,调用对应的方法:

        /**
         * 事件注冊
         */
        private void initEvent() {
            /**
             * 返回
             */
            ll_common_back.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    onBackPressed();
                }
            });
    
            /**
             * 右边标题点击
             */
            tv_common_right_title.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    onClickActionBar(ACTION_RIGHT);
                }
            });
    
            /**
             * 左边标题点击
             */
            tv_common_left_title.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    onClickActionBar(ACTION_LEFT);
                }
            });
    
            /**
             * 中间标题点击
             */
            tv_common_middle_title.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    onClickActionBar(ACTION_MIDDLE);
                }
            });
        }

    5、到这里启动程序,会出现背景黑色闪屏,在style文件里定义下面:

    <style name="TranslucentTheme" >
            <item name="android:windowContentOverlay">@null</item>
    </style>

    别忘了在AndroidManifest.xml中引用:

    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/TranslucentTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="com.example.actionbarbuildproject.SecondActivity"></activity>
    </application>

    优雅的使用ActionBar

    到这里定义的ActionBar已经创建完成。接下来我们的子Activity继承我们的BaseActionBarActivity。例如以下:

    package com.example.actionbarbuildproject;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    import com.example.actionbarbuildproject.base.BaseActionBarActivity;
    
    public class MainActivity extends BaseActionBarActivity {
    
        private Button btn_start;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setMainAction();
            setMiddleTitle("主页");
            initViews();
            initEvent();
        }
    
        private void initViews() {
            btn_start = (Button) findViewById(R.id.btn_start);
        }
    
        private void initEvent() {
            btn_start.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(MainActivity.this,
                            SecondActivity.class));
                }
            });
        }
    
        @Override
        protected void onClickActionBar(int type) {
            if (type == ACTION_MIDDLE) {
                Toast.makeText(this, "点击了中间标题", Toast.LENGTH_SHORT).show();
            }
        }
    
    }
    

    在onCreate方法中通过setMainAction和setMiddleTitle方法实现样式的订制,实现onClickActionBar抽象方法,依据type值获取的我们点击事件。由此ActionBar已经被我们统一管理了。最后使用是不是非常easy,当然。这里仅仅是一个思路,actionbar的样式能够依据业务需求来进行订制。

    下面是完整的github项目地址,欢迎star,fork。
    github项目源代码地址:点击【项目源代码】

  • 相关阅读:
    Session问题-一个部门A登录后未注销另一个部门B再登录,以B的身份操作A的成员
    Windows Server2008安装mysql5.6出现程序无法正常启动(0xc000007b)
    百度定位SDK
    Dubbo项目一段时间后提供者消失
    百度安卓SDK秘钥Key错误
    XGBoost类库使用小结
    支持向量机原理(五)线性支持回归
    主成分分析(PCA)原理总结
    scikit-learn 和pandas 基于windows单机机器学习环境的搭建
    梯度提升树(GBDT)原理小结
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7348974.html
Copyright © 2020-2023  润新知