Android进阶项目02-利用模版方法模式,打造BaseActivity

文章介绍了如何通过模板方法设计模式创建一个BaseActivity,这个基类包含了onCreate、initView和initData等生命周期方法的抽象实现,方便后续Activity的创建和代码复用。此外,还提供了防止连续点击的监听器、启动其他Activity的辅助方法以及泛型的findViewById方法。
摘要由CSDN通过智能技术生成

前文
在创建App页面的时候,我们会创建一个Activity.
Activity的启动流程是:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy.

我们新创建的Activity会去重写这几个方法,尤其是在onCreate()方法里去初始化控件、获取数据等。

系统的Activity其实就使用了模版方法模式,启动流程的那几个方法是每个Activity都需要的,所以处理成了模版方法。

本篇文章就是,通过模版方法设计模式,构建一个BaseActivity,以便将来创建新Activity的时候更方便,有一个良好的代码结构。

正文:
一、在baselibrary module下创建BaseActivity
在这里插入图片描述

BaseActivity继承自AppCompatActivity

package com.example.baselibrary.base;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.baselibrary.ioc.ViewUtils;

/**
 * @Name:EassyJoke
 * @Description:activity基类
 * @Author:jingyil
 * @Date:2/14/23 8:47 PM:
 * 把一些通用的功能放进来
 * 两个和两个以上的地方,使用一个工具类
 */
public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //设置布局layout
        setContentView(initLayout());
        ViewUtils.inject(this);

        //初始化布局
        initView();

        //初始化数据
        initData();

    }

    //protected 包内、子类可见
    protected abstract int initLayout();

    protected abstract void initView();

    protected abstract void initData();
    
}

我们在BaseActivity创建了三个被保护的抽象方法
修饰符protected : 同一个包中的类、子类可见
在这里插入图片描述

同一个包:就是.java文件中的第一行package要一致
在这里插入图片描述

这三个抽象方法是:
1.initLayout():设置页面的布局layout id , 传到setContentView()的id。
2.initView():初始化View控件,实例化view。
3.initData():初始化数据,网络拉取数据等。

二、添加一些其他的常用方法

package com.example.baselibrary.base;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.baselibrary.ioc.ViewUtils;

/**
 * @Name:EassyJoke
 * @Description:activity基类
 * @Author:jingyil
 * @Date:2/14/23 8:47 PM:
 * 把一些通用的功能放进来
 * 两个和两个以上的地方,使用一个工具类
 */
public abstract class BaseActivity extends AppCompatActivity {


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //设置布局layout
        setContentView(initLayout());
        ViewUtils.inject(this);

        //初始化布局
        initView();

        //初始化数据
        initData();
    }

    //protected 包内、子类可见
    protected abstract int initLayout();

    protected abstract void initView();

    protected abstract void initData();

    //防止连续点击的监听器,一秒钟
    public abstract class OnSingleClickListener implements View.OnClickListener {
        private final static int MIN_CLICK_DELAY_TIME = 1000;
        private long lastClickTime;

        public abstract void onSingleClick();

        @Override
        public void onClick(View v) {
            long currentClick = System.currentTimeMillis();
            if (currentClick - lastClickTime > 1000) {
                lastClickTime = currentClick;
                onSingleClick();
            }
        }
    }

    //启动activity
    protected void startActivity(Class<?> clazz) {
        Intent intent = new Intent(this, clazz);
        startActivity(intent);
    }

    //findViewById省去强转
    protected <T extends View> T viewById(int id) {
        return (T)findViewById(id);
    }
}

1.提供一个防止连续点击的监听器,常用的功能。

 //防止连续点击的监听器,一秒钟
    public abstract class OnSingleClickListener implements View.OnClickListener {
        private final static int MIN_CLICK_DELAY_TIME = 1000;
        private long lastClickTime;

        public abstract void onSingleClick();

        @Override
        public void onClick(View v) {
            long currentClick = System.currentTimeMillis();
            if (currentClick - lastClickTime > 1000) {
                lastClickTime = currentClick;
                onSingleClick();
            }
        }
    }

OnSingleClickListener继承View.OnClickListener
重写View.OnClickListener的onClick()方法
在onclick方法里再调用抽象方法onSingleClick()

2.提供一个启动其他Activity的方法,避免再去手动写Intent

//启动activity
    protected void startActivity(Class<?> clazz) {
        Intent intent = new Intent(this, clazz);
        startActivity(intent);
    }

3.提供一个更方便的findViewById方法,用泛型省去了类型转换

protected <T extends View> T viewById(int id) {
        return (T)findViewById(id);
    }

三、实际使用案例

package com.example.eassyjoke;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.baselibrary.base.BaseSkinActivity;
import com.example.baselibrary.ioc.OnClick;
import com.example.baselibrary.ioc.ViewById;
import com.example.baselibrary.ioc.ViewUtils;

public class MainActivity extends BaseSkinActivity {

    @ViewById(R.id.text_tv)
    private TextView textView;
    @ViewById(R.id.text_new_tv)
    private TextView textNewView;
    int clickNum = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    protected int initLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void initView() {
        textView.setText("Inject Test");
        textNewView.setText("New Text");
        textNewView.setOnClickListener(new OnSingleClickListener() {
            @Override
            public void onSingleClick() {
                clickNum++;
                Toast.makeText(MainActivity.this, "click num is " + clickNum, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    protected void initData() {

    }

    @OnClick({R.id.text_tv})
    private void onClick(View view) {
        Toast.makeText(this, "click", Toast.LENGTH_SHORT).show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值