自定义BaseActivity

思路很简单:将软件里用到的大量重复的页面布局抽象出来,编写成一个抽象的Activity类,然后在实现具体页面时继承它,并且在主内容空白区填入需要的内容。

例如在最近开发的一款资讯类应用中,每张页面上面都有一个顶栏,上面有两个按钮,按钮中间是一行标题文字。按钮上的文字及点击后的功能在每个页面中可能会都不相同。如下图所示的。

面对这样一个页面的需求,我们可以设计出一个基本的页面模板AbstractAc1,代码如下所示。

    /**
     * 通用页面模板1:含上栏,包括左右两个按钮,一个title文字区
     * @author zhe.yangz
     */
    public class AbstractAc1 extends BaseActivity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.abac_1);
        }
        /**
         * 设置主内容区域的layoutRes
         * @param layoutResId
         */
        public void alabSetContentView(int layoutResId) {
            LinearLayout llContent = (LinearLayout) findViewById(R.id.llContent1);
            LayoutInflater inflater = (LayoutInflater) getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            View v = inflater.inflate(layoutResId, null);
            llContent.addView(v);
        }
        /**
         * 隐藏左侧按钮
         */
        public void alabHideButtonLeft(boolean bSetHide) {
            Button bt = alabGetButtonLeft();
            if (null != bt) {
                if (bSetHide) bt.setVisibility(View.INVISIBLE);
                else bt.setVisibility(View.VISIBLE);
            }
        }
        /**
         * 隐藏右侧按钮
         */
        public void alabHideButtonRight(boolean bSetHide) {
            Button bt = alabGetButtonRight();
            if (null != bt) {
                if (bSetHide) bt.setVisibility(View.INVISIBLE);
                else bt.setVisibility(View.VISIBLE);
            }
        }
        /**
         * 得到模板上导航栏的左侧按钮,一般为[返回]
         * @return 成功则返回Button对象,失败则返回null。
         */
        public Button alabGetButtonLeft() {
            return (Button) findViewById(R.id.btBack1);
        }
        /**
         * 得到模板上导航栏的右侧按钮,一般为[刷新]
         * @return 成功则返回Button对象,失败则返回null。
         */
        public Button alabGetButtonRight() {
            return (Button) findViewById(R.id.btRefresh1);
        }
        /**
         * 设置模板上导航栏中间的标题文字
         * @param titleText
         * @return 修改成功返回true,失败返回false
         */
        public boolean alabSetBarTitleText(String titleText) {
            TextView tv = (TextView) findViewById(R.id.txBarTitle1);
            if (null != tv) {
                tv.setText(titleText);
                return true;
            }
            return false;
        }
    } 

我们创建了一张模板页面,然后在应用中的实际页面继承于它。这样,每张继承的页面都可以拥有类似的顶栏布局,并且代码简洁。下面就是继承的例子。

    /**
     * 样例页面
    * @author zhe.yangz
     */
    public class HomeActivity extends AbstractAc1 {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            alabSetContentView(R.layout.ac_home);
            setTopBarAndAction();
        }
        private void setTopBarAndAction() {
            alabSetBarTitleText("TEST HOME"); // 设置Title标题
            alabGetButtonLeft().setText("LeftBt"); // 设置左按钮上的文字
            alabGetButtonRight().setText("RightBt"); // 设置右按钮上的文字
            alabGetButtonRight().setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 按钮执行事件
                    // ...
                }
            });
        }
    } 

就完成了一张具有如下顶栏效果的页面,页面的背景、按钮配色等效果在AbstractAc1中定义。

alabSetContentView()是在AbstractAc1中定义的方法,在衍生类中调用该方法,传入一个界面定义xml,方法中实现了 使用LayoutInflater生成view,使得这个页面中定义的主内容区的界面xml会和原来AbstractAc1的界面xml合并在一起,成为 一个完整的页面。有些情况下,左右按钮可以单独或一起隐藏,可以使用AbstractAc1中定义的alabHideButtonLeft和 alabHideButtonRight进行设置。

使用模板化方式开发界面,目前我们开发的Android应用中的Activity的层次结构大致如下。

时间: 2024-10-08 23:42:34

自定义BaseActivity的相关文章

Android常见问题总结(四)

上一篇博客传送门:Android常见问题总结(三) 16. 动画有哪几类,各有什么特点 如今Android的动画主要有三种,分别是:逐帧(Frame)动画,补间(Tween)动画,属性(Property)动画 逐帧(Frame)动画 逐帧动画是最容易理解的动画,它要求我们把动画过程的每张静态图片都准备好,然后依次显示,利用人眼"视觉暂留"的原理形成动画效果. 例子:肥波跳舞? 素材准备(共27帧): fat_po.xml: <?xml version="1.0"

自定义Activity的跳转动画

本来感觉是一个很小的需求, 后来发现老是 出问题, 使用Theme在 4.0上 操作不是很好用. 后来查阅资料, 需要在finish 后面 和 startActivity 后面添加 overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); 这句话 但是每个地方都添加这个代码也很坑爹, 于是看了一下ECShop的实现,发现是在BaseActivity加入的.. @Override public void star

Android自定义视频播放器(网络/本地)

最近因公司项目要求需要写一个播放器,自带的又不太好用,也不太好看.自能自定义啦.查看了很多资料,都没有完善的,还好得以为前辈的指点得以完成,感谢Yang.本篇里面我有可能有些地方写得不好(都附上了注释).希望各路大神指点,虚心受教. 先来个图(源码在后面附上) 视频列表里面的数据是本地的,如果你需要使用网络的只需要在此获取服务器的数据展示就行了.播放页面在后面. package com.eteng.moblieplayer.video; import android.content.Conten

安卓自定义状态栏颜色以与APP风格保持一致

我们知道IOS上的应用,状态栏的颜色总能与应用标题栏颜色保持一致,用户体验很不错,那安卓是否可以呢?若是在安卓4.4之前,答案是否定的,但在4.4之后,谷歌允许开发者自定义状态栏背景颜色啦,这是个不错的体验!若你手机上安装有最新版的qq,并且你的安卓SDK版本是4.4及以上,你可以看下它的效果: 实现此功能有两种方法: 1.在xml中设置主题或自定义style: Theme.Holo.Light.NoActionBar.TranslucentDecor Theme.Holo.NoActionBa

Android自定义Viewgroup切换View带有吸附效果

1.概述 先上效果图 大概就是这个效果,先说说实现思路 1.首先我们要拿到图片的url(网络)或id.路径(本地),将View与数据进行绑定,写我们自己的Adapter 2.自定义Viewgroup将要显示的view进行布局,以及处理触摸事件进行逻辑处理 3.写切换回调 2.实现 1)自定义Adapter 这里我下载的网络图片,同样可以将图片放到res下设置ImageView的内容 public class DragPageViewAdapter { private static final S

友盟Umeng统计、自定义统计使用

友盟统计分析是移动终端上不可多得的佳品,鉴于在开发中使用到,随笔写下使用过程. 友盟SDK下载(包含统计功能和自动更新功能): 第一步:导入SDK 1. 解压文件,libs 文件夹内的jar文件直接复制到eclipse工程同名文件夹内:然后点击build Path 2. 将 res 内所有文件复制到eclipse工程内,合并res资源,所有资源前缀均为 umeng_ . 第二步:添加权限及相关信息 1. 使用统计功能添加如下权限: <uses-permission android:name=&quo

Android开发:Toolbar基本使用和自定义Toolbar

Toolbar简介 Toolbar 是 Android 5.0 推出的一个 Material Design 风格的导航控件 ,用来取代之前的 Actionbar .与 Actionbar 相比,Toolbar 明显要灵活的多.它不像 Actionbar 一样,一定要固定在Activity的顶部,而是可以放到界面的任意位置,看下官方文档介绍: 注意看着几部分: - 1.设置导航栏图标: - 2.设置App的logo: - 3.支持设置标题和子标题: - 4.支持添加一个或多个的自定义控件: - 5

android自定义listview实现圆角

在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种更好的实现方式.在这里先看一下shape的使用: [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schema

自定义组件------带删除功能的EditText

以前在为EditText添加左侧图标,以及右侧一个删除按钮时,经常是使用FrameLayout,当这样代码复用差,维护也麻烦.最好的方法是重写EditText实现该功能.现在看看效果图,后面再讲解实现方式. 重写之后的组件有如下功能,只有当EditText内容不为空,而且获得焦点,才会出现删除按钮,点击删除按钮则清空内容.代码如下: public class CleanableEditText extends EditText { //回调函数 private TextWatcherCallBa