在开发过程中经常遇到多个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>

[原创]自定义BaseAcitivity的实现,统一activity的UI风格样式的更多相关文章

  1. 统一项目中编码风格(Eclipse Java code format、codetemplate)

    在公司内的日常开发过程中,除了需要遵守统一的编码规范之外,还需要对编写的代码做统一的格式化,Eclipse提供了格式化编码的工具,快捷键是:Ctrl+Shift+F. 为了统一项目组的代码风格,建议使 ...

  2. Activity中UI框架基本概念

    Activity中UI框架基本概念 Activity 是应用程序的基本组成部分,提供了可视的界面,UI容器, 与用户进行交互: 具体Acitivity是怎么样显示这些事视图元素以及响应事件交互的. 一 ...

  3. android开发之在activity中控制另一个activity的UI更新

    转自:http://blog.csdn.net/jason0539/article/details/18075293 第一种方法: 遇到一个问题,需要在一个activity中控制另一个acitivit ...

  4. 用 Prettier 统一团队的代码风格~

    使用 prettier 自動調整 JavaScript 樣式 GFM 格式说明 为什么你不能缺少Linter(以及代码美化工具) 使用 prettier 自動調整 JavaScript 樣式 Reac ...

  5. Android 如何利用Activity的Dialog风格完成弹出框设计

    在我们使用Dialog时,如果需要用到很多自己设计的控件,虽然可以让弹出框显示出我们需要的界面,但却无法找到地方完成控制代码的编写,如何解决这个问题呢,我们可以将Activity伪装成Dialog弹出 ...

  6. Activity + 基础UI

    目录 Activity + 基础UI 1. 返回键退出进入应用: 2. home键以后 3. home键退出切换字体 二:AndroidManifest配置theme改变UI效果 三:UI 报错: A ...

  7. 自定义的IntentFileter 无法找到activity

    <intent-filter > <action android:name="com.leo.enjoytime.VIEW"/></intent-fi ...

  8. android自定义view系列:认识activity结构

    标签: android 自定义view activity 开发中虽然我们调用Activity的setContentView(R.layout.activity_main)方法显示View视图,但是vi ...

  9. 配置springboot在访问404时自定义返回结果以及统一异常处理

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...

随机推荐

  1. ubuntu下配置安装PYQT4

    apt-get安装(快) sudo apt-get install libxext6 libxext-dev libqt4-dev libqt4-gui libqt4-sql qt4-dev-tool ...

  2. C++语法之-------strcpy,memcpy,memset

    1.strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#i nclude 功能:把src所指由NULL结束的字符串复制到dest所指的数组 ...

  3. JAVA学习博客----2015.4

    这是开始写的第一篇学习博客,记录一下每个月的学习进度和掌握程度,因为这是第一次写学习博客而且已经看编程方面的书已经有几个月了,所以这一篇学习博客可能看似有些乱或者篇幅太长.从十二月的<程序员教程 ...

  4. C#分布式缓存一:Couchbase的安装与简单使用

    一.简介 目前C#业界使用得最多的 Cache 系统主要是 Memcached和 Redis. 这两个 Cache 系统可以说是比较成熟的解决方案,也是很多系统当然的选择. Memcache的开发团队 ...

  5. [汇编] C语言中嵌入汇编

    >_<" 下面是在C语言中嵌入汇编的例子,下面是三点要注意的~ 1.内联式汇编 2._asm关键字 3.并不是所有中断都能被支持 #include<iostream> ...

  6. SignalR实现服务器与客户端的实时通信

    百度百科给它的定义 实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的. WebSockets是HTML5提供的新的API,可以 ...

  7. 基于RequireJS和JQuery的模块化编程——常见问题解析

    由于js的代码逻辑越来越重,一个js文件可能会有上千行,十分不利于开发与维护.最近正在把逻辑很重的js拆分成模块,在一顿纠结是使用requirejs还是seajs的时候,最终还是偏向于requirej ...

  8. Java thread jargon

    In Java thread topic, the task to be executed and the thread to drive the task are two concepts shou ...

  9. DataWindow.Net 2.5 配置

    在用过的所有的开发工具中,感觉最简单好用的就数PB了,他的DataWindow最方便,拖拖拽拽就把报表做好了,可惜现在很少人有用了.现在C/S系统一般用C#来做,但是做报表的时候总感觉没有DataWi ...

  10. Android布局优化

    前言 本篇文章为Android优化的布局部分,该部分应该是Android中很重要的,无论是在自定义控件中,还是在简单的书写布局时,都应该尽量遵循一些优化原则,这样布局的绘制效率才会更高,体验才能更好. ...