Android开发:Android简单通用BaseActivity基类的封装

基于ViewBinding的BaseActivity封装尝试 软件环境 Android Studio 3.6.1 / Android Studio4.1.2 gradle 5.6.4 / gradle 6.5 targetSdkVersion 29 buildToolsVersion “29.0.3” java 1.8 阅读详情

 

目录

一、BaseActivity基类的封装

二、继承基类BaseActivty的Activity的使用事例

 三、基类中的Activity工具类ActivityCollector(参考郭霖第二行代码)

                                                                 


 

一、BaseActivity基类的封装

public abstract class BaseActivity extends AppCompatActivity {
    //获取TAG的activity名称
    protected final String TAG = this.getClass().getSimpleName();
    //是否显示标题栏
    private boolean isShowTitle = true;
    //是否显示状态栏
    private boolean isShowStatusBar = true;
    //是否允许旋转屏幕
    private boolean isAllowScreenRoate = true;
    //封装Toast对象
    private static Toast toast;
    public Context context;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        //activity管理
        ActivityCollector.addActivity(this);
        if (!isShowTitle) {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
        }

        if (isShowStatusBar) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
                    , WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }

        //设置布局
        setContentView(initLayout());
        //设置屏幕是否可旋转
        if (!isAllowScreenRoate) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        //初始化控件
        initView();
        //设置数据
        initData();
    }

    /**
     * 初始化布局
     *
     * @return 布局id
     */
    protected abstract int initLayout();

    /**
     * 初始化控件
     */
    protected abstract void initView();

    /**
     * 设置数据
     */
    protected abstract void initData();

    /**
     * 设置是否显示标题栏
     *
     * @param showTitle true or false
     */
    public void setShowTitle(boolean showTitle) {
        isShowTitle = showTitle;
    }

    /**
     * 设置是否显示状态栏
     *
     * @param showStatusBar true or false
     */
    public void setShowStatusBar(boolean showStatusBar) {
        isShowStatusBar = showStatusBar;
    }

    /**
     * 是否允许屏幕旋转
     *
     * @param allowScreenRoate true or false
     */
    public void setAllowScreenRoate(boolean allowScreenRoate) {
        isAllowScreenRoate = allowScreenRoate;
    }

    /**
     * 保证同一按钮在1秒内只会响应一次点击事件
     */
    public abstract class OnSingleClickListener implements View.OnClickListener {
        //两次点击按钮之间的间隔,目前为1000ms
        private static final int MIN_CLICK_DELAY_TIME = 1000;
        private long lastClickTime;

        public abstract void onSingleClick(View view);

        @Override
        public void onClick(View view) {
            long curClickTime = System.currentTimeMillis();
            if ((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
                lastClickTime = curClickTime;
                onSingleClick(view);
            }
        }
    }

    /**
     * 同一按钮在短时间内可重复响应点击事件
     */
    public abstract class OnMultiClickListener implements View.OnClickListener {
        public abstract void onMultiClick(View view);

        @Override
        public void onClick(View v) {
            onMultiClick(v);
        }
    }

     /**
     * 显示提示  toast
     *
     * @param msg 提示信息
     */
    @SuppressLint("ShowToast")
    public void showToast(String msg) {
        try {
            if (null == toast) {
                toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
            } else {
                toast.setText(msg);
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    toast.show();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
            //解决在子线程中调用Toast的异常情况处理
            Looper.prepare();
            Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
            Looper.loop();
        }
    }


    /**
     * 隐藏软键盘
     */
    public void hideSoftInput() {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        if (getCurrentFocus() != null && null != imm) {
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    }

    /**
     * 显示软键盘
     */
    public void showSoftInput() {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        if (getCurrentFocus() != null && null != imm) {
            imm.showSoftInputFromInputMethod(getCurrentFocus().getWindowToken(), 0);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //activity管理
        ActivityCollector.removeActivity(this);
    }
}

 

二、继承基类BaseActivty的Activity的使用事例

public class ThirtyFiveActivity extends BaseActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //设置是否显示标题栏
        setShowTitle(true);
        //设置是否显示状态栏
        setShowStatusBar(true);
        //是否允许屏幕旋转
        setAllowScreenRoate(true);
        //以上设置一定要在 super.onCreate(savedInstanceState) 方法之前设置
        super.onCreate(savedInstanceState);
    }

    @Override
    protected int initLayout() {
        //初始化布局
        return R.layout.activity_add_address;
    }

    @Override
    protected void initView() {
        //初始化控件
        Button button = new Button(context);
        button.setText("click");
        //每秒只响应一次点击事件
        button.setOnClickListener(new OnSingleClickListener() {
            @Override
            public void onSingleClick(View view) {

            }
        });
        //每秒可以重复响应点击事件
        button.setOnClickListener(new OnMultiClickListener() {
            @Override
            public void onMultiClick(View view) {

            }
        });
    }

    @Override
    protected void initData() {

        //初始化、绑定数据
    }


}

 

 三、基类中的Activity工具类ActivityCollector(参考郭霖第二行代码)

public class ActivityCollector {

    public static List<Activity> activitys = new ArrayList<Activity>();

    /**
     * 向List中添加一个活动
     *
     * @param activity 活动
     */
    public static void addActivity(Activity activity) {

        activitys.add(activity);
    }

    /**
     * 从List中移除活动
     *
     * @param activity 活动
     */
    public static void removeActivity(Activity activity) {

        activitys.remove(activity);
    }

    /**
     * 将List中存储的活动全部销毁掉
     */
    public static void finishAll() {

        for (Activity activity : activitys) {

            if (!activity.isFinishing()) {

                activity.finish();
            }
        }
    }
}

 

 

                                                                    结束!

 

 

Android BaseActivity App框架设计BaseActivity封装 Android BaseActivity 分享在Android开发中,为了更好的对栈堆中的Activity进行管理以及更有效的对程序中可复用的方法进行复用,我们通常会为程序写一个Activity的基类,这次我就分享一个Activity基类的基本写法。希望能够帮助到兄弟姐妹们。在开发的过程中,Activity通常会使用到FragmentActivity而FragmentActivity是继承Activ 阅读详情

相关推荐

我的Android开发之旅(一):BaseActivity的浅入之简单封装 Toolbar

我的Android开发之旅(一):BaseActivity的浅入为什么要写BaseAcivity一行代码实现 Toolbar 效果“少啰嗦,先看东西”最后 为什么要写BaseAcivity 我们都知道在做Android应用开发的时候都需要创建一个Activity,但很多时候我们的程序有多个界面并且每个界面都有相似的内容(例如:Toolbar、DrawerLayout)和后台的操作有共同的方法,这个...

梁大侠的博客 3387

BaseActivity的作用

在开发中,我们通常都会建一个BaseActivity继承Activity,而我们其他的Activity只要继承BaseActivity就可以,那么BaseActivity到底有什么作用呢?很简单,开发中我们经常都要获取屏幕的宽高,但是如果有多个Activity都需要获取屏幕的宽高呢?那每个Activity都要重复获取,多了很多不必要的代码,这时候就需要用到BaseActivity了。 当然Bas

fuxuanyang的博客 7412

Android中自定义BaseActivity编程

总结一下,在Android中定义BaseActivity可以通过创建一个继承自AppCompatActivity的基类活动,并在其中实现通用的功能和逻辑。其他活动可以继承BaseActivity来重用这些功能,从而提高代码的重用性和维护性。在Android开发中,BaseActivity是一个常见的概念,它是一个基类活动,用于实现一些通用的功能和逻辑,然后其他活动可以继承它来重用这些功能。在BaseActivity的onCreate方法中,我们可以添加一些通用的初始化逻辑,例如设置主题、初始化全局变量等。

PixelInk的博客 370

Android 项目必备(三)--> 基类 BaseActivity & BaseFragment

在实际的 Android 产品研发中,一般的我们在写 Activity 的时候都会继承于一个基类 BaseActivity,该 BaseActivity是所有的 Activity 的基类。在该基类中我们主要用于重写一些共有的逻辑。好处是显而易见的对于一些 Activity 的共有逻辑我们不必要在每个 Activity 中都重新写一遍,只需要在基类 Activity 中写一遍就好了。.........

Kevin Learn Android 3329

Android普通项目通用BaseActivity

小型项目通用的BaseActivity,包含沉浸式,全屏,搭配使用QMUI框架,效果杠杠的。

Android自定义顶部标题栏

Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏Android自定义顶部标题栏

Android封装含有通用标题栏的基类BaseActivity

安卓开发中,经常会遇到项目的标题栏基本样式都是一致的,只有个别界面需要定制化,而TitltBar或许跟我们的业务需求不是很相符,所以很多时候我们都想要去封装一个含有通用标题栏并且可定制化的BaseActivity。本文希望对有这方面需求的童鞋提供一种参考。效果图类似于这样 首先很多开发者比较喜欢的一种做法是写一份通用的标题栏布局,然后在每次创建的Activity的布局文件中去选择includ...

Leo Wang的博客 2855

1014. 福尔摩斯的约会 (20)-PAT乙级真题

1014. 福尔摩斯的约会 (20) 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母’D’,代表星期四;第2对相同的字符是’

柳婼 の blog 2646

Android 基类BaseActivity的封装

摘要本篇总结了前人写的BaseActivity,自己在开发过程中也添添补补,删删改改,现在总结下。本篇很多知识借鉴和学习了知乎上iYng大大的回答,先感谢一波。顺便上原文链接: https://www.zhihu.com/question/47045239/answer/105086885正文一般来说,不同的项目的BaseActivity不尽相同,根据不同的业务逻辑和功能需求,会有很多区别。这里总

black_dreamer的专栏 1万+

点云配准实战:用DGCNN+Transformer+SVD搞定3D模型对齐(附PyTorch代码)

本文详细介绍了基于深度学习的点云配准实战方法,重点解析了Deep Closest Point (DCP)模型。该模型融合了DGCNN、Transformer和可微分SVD三大核心模块,能够端到端地预测点云间的刚性变换,有效克服传统ICP算法对初始位置敏感、易陷入局部最优的缺点。文章提供了完整的PyTorch代码实现、ModelNet40数据集处理、训练策略及显存优化技巧,旨在帮助开发者在机器人、自动驾驶等领域实现精准的3D模型对齐。

weixin_29061041的博客 155

下水管道损坏检测数据集总结

下水管道损坏检测数据集包含 6708 张图像,为下水管道损坏情况的检测提供了丰富的数据基础。该数据集提供了 YOLO 和 VOC 两种常见的标注方式,方便不同需求的使用者进行模型训练和研究。

crz1336768325的博客 870

Android基类BaseActivity简单封装

在日常的开发中,对于Activity所继承的AppCompatActivity进行一个简单的封装是再正常不过的。好处实在是不用多说。那么。我们今天就来看一个经过简单封装的BaseActivity。 首先,新建基类:BaseActivity.java public abstract class BaseActivity extends AppCompatActivity { //获取TAG...

lixinxiaos的博客 756

wimdows11 eplan安装过程及遇到的问题

eplan 安装 我的资源里的下载地址,当然也可以有其他渠道下载 https://download.youkuaiyun.com/download/weixin_45529296/85061161 安装1 打开“Electric P8 2.7.3.11418”目录,运行“setup.exe”开始安装,选择系统和程序 接受许可协议,下一步 自己配置安装的各种路径,下一步 安装这个没什么问题,直到完成就行; 安装2 ...

csdn-1122 2万+

ViewBinding封装基类(BaseActivity,BaseFragment)

BaseActivity: public class BaseActivity<T extends ViewBinding> extends AppCompatActivity { protected T binding; @Override protected void onCreate(@Nullable Bundle savedInstanceStat...

jingzz1的博客 1万+

Sigrity System SI Parallel Bus Analysis模式进行DDR3仿真分析操作指导-单个颗粒

Default Strobe Offset:DQS默认偏移时间,自动填充为0.5ns,即DQS默认偏移1/2UI,DQS滞后于DQ 1/2UI,让建立保持时间均分。WLO:写平衡偏移的数值,DataL是0ps,DataU是500ps,是根据WLOSkew自动定义的,可以认为是WLOSkew取整,也可以根据需要手动调整数值。注意AddCmd的UI=T,这里的Data Rate仍然是DQ的速率,并不是地址线的速率,地址线的速率=1/UI=1/2ns=0.5Gbps。

weixin_54787054的博客 366

图形推理2-四大类六提示

图形推理笔记2

小y的学习笔记 6746

Android 之路 (7) - 对BaseActivity的简单封装

引言 终于到了BaseActivity的封装了,在本章中将对通用性的一些方法和操作进行抽取,放到Base中。 正文 先起个名字,我们的Base就叫CandyBaseActivity吧,Candy是糖果的意思,我希望这一套东西能让人像吃糖果一样的甜! 分析 在本篇中关于Base,我们需要进行两种封装: CandyBaseActivity,最基本,最底层的Base,附带通用操作的封装。 Candy...

AndroidRookie 1919

【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部

本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~ 文章目录本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~一、项目展示二、项目资源共享1:训练图片:香烟图片+吸烟手势+烟雾三、

cv君的博客 13万+

BaseActivity中封装通用的Toolbar

之前写过一篇关于Toolbar的文章,最近在搭建新项目时对Toolbar做了简单的封装。封装的预期目标是只在BaseActivity中引入Toolbar,然后子Activity通过继承BaseActivity就能显示Toolbar。话不多说,看看效果如何实现。 因为我们使用toolbar作为titlebar,因此首先需要去掉Actionbar,在style文件下修改默认Theme的parent为...

smily的博客 8393

LPDDR4 JEDEC标准测试实例解析--写操作

LPDDR4的JEDEC标准一致性测试项详解以及实例分享,满满干货!感兴趣的小伙伴可以持续关注!!

一只豌豆象的博客 7775

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android Studio: BaseActivity基类设计——万能的家政保姆

本文是基于Android Studio真实项目,通过解析源码了解真实应用场景,写文的视角和读者是同步的,想到看到写到,没有上帝视角。,本文是第三期。简单来说,前两期的内容分别是代码解耦合和视图绑定,今天来看一下BaseActivity的全貌。

weixin_51020083的博客 1411

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android将 ViewBinding封装到BaseActivity基类中(Java版)1

项目已经启用了ViewBinding。“ViewBinding的类型”

qianfeifeio的专栏 2165

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

安卓简单通用的基类(BaseActivity)的封装

一,新建抽象的BaseActivity继承Activity 设置布局,标题栏是否显示,是否全屏,toast简化弹出,初始化控件,数据等。 public abstract class BaseActivity extends Activity { /***是否显示标题栏*/ private boolean isshowtitle = true; /***是否显示标题栏*

红酒配电影 1万+

Android开发必备:高效BaseActivity基类封装详解

本文分享了一个实用的Android BaseActivity基类封装方案。该方案包含状态栏管理、ViewBinding集成、字体控制等核心功能,通过统一的状态栏配置、标准化的初始化流程和简洁的点击事件管理,显著提升开发效率和代码维护性。文章详细介绍了实现原理,并提供了使用示例,特别适合需要统一UI风格和快速开发的Android项目。同时提醒开发者注意横屏适配的适用场景、ViewBinding配置要求以及内存管理问题。该方案经过实践验证,能有效规范Activity开发流程,值得Android开发者参考借鉴。

Jm0218Xx的博客 256

自定义基类BaseActivity,节省开发步骤

自己在开发过程中发现同一个APP中,一般多个activity都拥有相同的Titlebar,而且相同的按钮作用也是一样的,如果每次在xml中都去写布局文件,未免太费事,不如直接抽取一个基类BaseActivity,以后自己开发activity直接继承BaseActivity就好,这里记录下自己曾经抽取的BaseActivity public abstract class BaseActivity

逗比学习笔记 4600
上一篇: Android开发:Android颜色透明度换算表
下一篇: Android开发:Android简单通用BaseFragment基类的封装
android157
博客等级 码龄9年 193粉丝 95原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值