zoukankan      html  css  js  c++  java
  • [原创]自定义BaseAcitivity的实现,统一activity的UI风格样式

        在开发过程中经常遇到多个activity是同一种样式类型的情况,如果分别对其进行UI的布局,不但比较繁琐,而且后续维护过程人力成本很高,不利于敏捷开发。解决的方案是采用抽象后的BaseActivity。
     
        BaseActivity一般作为一个app的所有或者部分activity的父类,并覆写setContentView( )等方法,以达到继承此BaseActivity的多个界面采用较为统一的样式进行开发,同时我们可以扩展BaseActivity的接口,提供一些灵活的个性化方式。下面是实现的主要步骤。
     
    1.首先,为想要统一的样式做一个layout资源框架,用来提供UI显示的内容,一般来说可以使用上部ToolBar+下部ViewGroup的方式,并更改theme。
     
    BaseActivity的layout资源:
     
    <?xml version= "1.0" encoding ="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width= "match_parent"
        android:layout_height= "match_parent"
        android:orientation= "vertical" >
    
        <RelativeLayout
            android:id="@+id/bar"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="#44550000" />
    
        <RelativeLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#44005500" />
    
    </LinearLayout>

    自定义的theme,去掉ActionBar:

        <style name="AppThemeNoActionBar" parent="AppBaseTheme" >
            <item name= "android:windowActionBar" >false </item>
            <item name= "android:windowNoTitle" >true </item>
        </style >
    2.编写BaseActivity,为了使继承于BaseActivity的activity可以使用通常的函数进行UI控制,在BaseActivity中覆写setContentView( )方法。
    下面是BaseActivity的实现:
     
    package cn.carbs.testandroidbaseactivity;
    
    public class BaseActivity extends Activity{
    
        protected RelativeLayout content;
        protected int colorPrimary ;
        protected int colorPrimaryDark ;
        protected int colorAccent ;
         
        @Override
        protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             super.setContentView(getBaseActivityLayout());
             TypedArray array = obtainStyledAttributes( new int[]{R.attr.colorPrimary, R.attr. colorPrimaryDark, R.attr.colorAccent});
             colorPrimary = array.getColor(0, 0xFF1473AF);
             colorPrimaryDark = array.getColor(1, 0xFF11659A);
             colorAccent = array.getColor(2, 0xFF3C69CE);
             array.recycle();
        }
         
        protected int getBaseActivityLayout() {
             return R.layout.activity_base;
        }
         
        @Override
        public void setContentView(int layoutResID) {
             //使用如下方法可以将layoutResID对应的 xml资源的view解析出来,并添加到R.id.content中
    //       getLayoutInflater().inflate(layoutResID, (ViewGroup) this.findViewById(R.id.content));
             //使用如下方法可以将layoutResID对应的 xml资源的view解析出来,并添加到R.id.content中
    //       View.inflate(this, layoutResID, (ViewGroup) this.findViewById(R.id.content));
             //使用如下方法可以将layoutResID对应的 xml资源的viewinflate出来,但是没有添加到任何ViewGroup中
    //       View v = View.inflate(this, layoutResID, null);
              
             setContentView(View. inflate(this, layoutResID, null));
        }
         
        @Override
        public void setContentView(View view) {
             ((ViewGroup) this.findViewById(R.id.content))
                                .addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams. MATCH_PARENT));
        }
         
    }

    3.编写一个Activity使其继承自BaseActivity:

    package cn.carbs.testandroidbaseactivity;
    
    import android.os.Bundle;
    
    public class MainActivity extends BaseActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout. activity_main);
        }
    
        //可以通过如下代码,覆写BaseActivity中的主界面的布局
        @Override
        protected int getBaseActivityLayout(){
         return R.layout. activity_base_new;
        }
       
    }
    4.上述代码中用到的布局文件:
    activity_main.xml
     
    <RelativeLayout 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"
        android:background= "#33333399"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop= "@dimen/activity_vertical_margin"
        tools:context= ".MainActivity" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    
    </RelativeLayout>

    activity_base.xml

    <?xml version= "1.0" encoding ="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width= "match_parent"
        android:layout_height= "match_parent"
        android:orientation= "vertical" >
    
        <RelativeLayout
            android:id="@+id/bar"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="#44550000" />
    
        <RelativeLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#44005500" />
    
    </LinearLayout>

    activity_base_new.xml

    <?xml version= "1.0" encoding ="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width= "match_parent"
        android:layout_height= "match_parent"
        android:orientation= "vertical" >
    
        <RelativeLayout
            android:id="@+id/bar"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="#ffffffff" />
    
        <RelativeLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#44005500" />
    
    </LinearLayout>
  • 相关阅读:
    leetcode题解:Search in Rotated Sorted Array(旋转排序数组查找)
    leetcode 题解:Remove Duplicates from Sorted Array II(已排序数组去三次及以上重复元素)
    leetcode 题解:Remove Duplicates from Sorted Array(已排序数组去重)
    leetcode题解:Tree Level Order Traversal II (二叉树的层序遍历 2)
    leetcode 题解:Binary Tree Level Order Traversal (二叉树的层序遍历)
    c++ STL:队列queue、优先队列priority queue 的使用
    leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)
    算术表达式解析(第三版)词法分析版
    经典算法:牛顿迭代法求平方根
    进入游戏行业1年的总结
  • 原文地址:https://www.cnblogs.com/carbs/p/5436336.html
Copyright © 2011-2022 走看看