SkillAgentSearch skills...

BaseFramework

🔥BaseFramework是一款基础适配框架,包含沉浸式适配、对 Activity、Fragment 以及 Adapter 的封装,并提供了一些诸如权限申请、跳转、延时操作、提示、日志输出等小工具,以方便快速构建 Android App

Install / Use

/learn @kongzue/BaseFramework
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

BaseFramework(AndroidX)

BaseFramework 是什么?

BaseFramework框架包含沉浸式适配、对 Activity、Fragment 以及 Adapter 的封装,并提供了一些诸如权限申请、跳转、延时操作、提示、日志输出等小工具,以方便快速构建 Android App;

<a href="https://github.com/kongzue/BaseFramework/"> <img src="https://img.shields.io/badge/Kongzue-BaseFramework-green.svg" alt="Kongzue BaseFramework"> </a> <a href="https://jitpack.io/#kongzue/BaseFramework"> <img src="https://jitpack.io/v/kongzue/BaseFramework.svg" alt="Jitpack.io"> </a> <a href="http://www.apache.org/licenses/LICENSE-2.0"> <img src="https://img.shields.io/badge/License-Apache%202.0-red.svg" alt="License"> </a> <a href="http://www.kongzue.com"> <img src="https://img.shields.io/badge/Homepage-Kongzue.com-brightgreen.svg" alt="Homepage"> </a>

Demo预览图如下:

BaseFramework

试用版和使用方法 Demo 可以前往 http://beta.kongzue.com/basefw 下载

<div align=center><img src="https://github.com/kongzue/Res/raw/master/app/src/main/res/mipmap-xxxhdpi/download_baseframework.png" alt="Kongzue's BaseFramework" width="250" height="250" /></div>

使用前的约定与须知

  • 更轻松!在 BaseActivity 中,约定关键词me代替Activity.this,因此您在编写代码时,在异步线程中可以轻松使用me关键字直接引用当前的父Activity。

  • 请忘掉重写你的 onCreate 吧!在新版本的 BaseFramework 中,请在您的 Activity 的 class 上使用注解 @Layout(R.layout.xxx) ,剩下的事情我们会自动帮您完成!

  • 规范化!无论是在 BaseActivity 还是 BaseFragment ,默认都有 initViews()、initDatas()、setEvents() 三个方法,他们分别代表加载组件、初始化数据、组件绑定事件三个步骤,因其执行顺序是固定的,且为了代码规范化,这三个方法必须重写,也建议将相关业务逻辑写在对应方法中,以方便维护和管理。

  • 骚操作!提供大量更为好用和快捷的常用方法工具,大幅度减少因参数、引用造成的额外代码量,更好用的日志输出方便甩锅,不死的小强更能保证你的 App 不再因为异常而闪退。

Maven仓库或Gradle的引用方式

引入方式

MavenCentral 源

  1. 前往 build.gradle(project) 添加 jitpack 仓库:
allprojects {
    repositories {
        ...
        mavenCentral()
    }
}
  1. 引入 BaseFramework:
<div> 最新版本: <a href="https://github.com/kongzue/BaseFramework/releases"><img src="https://img.shields.io/badge/MavenCentral%20Release-6.8.7-green.svg" alt="BaseFramework Release"></a></div>
dependencies {
    implementation "com.kongzue.baseframework:BaseFramework:6.8.7"
}

Jitpack 源

  1. 前往 build.gradle(project) 添加 jitpack 仓库:
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  1. 引入 BaseFramework:

最新版本: <a href="https://jitpack.io/#kongzue/BaseFramework"> <img src="https://jitpack.io/v/kongzue/BaseFramework.svg" alt="Jitpack.io"> </a>

dependencies {
        implementation 'com.github.kongzue:BaseFramework:latest.release'
}

Support版本

由于 Google Android Support 的支持原因,Support 版本将不再更新,要使用最后的 Support 支持版本,请前往:

Kongzue BaseFramework(Support)

使用提示

以下文档为各功能模块的介绍,额外的,强烈建议阅读 DemoActivity.javaFunctionFragment.java 两个范例代码内容以了解更详细的开发流程和功能说明。

目录

· <a href="#1">BaseActivity功能</a>

···· <a href="#1-0">沉浸式</a>

···· <a href="#1-1">绑定 Layout 布局</a>

···· <a href="#1-2">跳转、Activity间通讯</a>

···· <a href="#1-3">更简单的跳转后返回数据</a>

···· <a href="#1-4">权限申请</a>

···· <a href="#1-5">BaseActivity提供的小工具</a>

···· <a href="#1-6">BaseActivity的生命周期</a>

···· <a href="#1-7">侧滑返回</a>

···· <a href="#1-8">布局绑定和事件绑定</a>

· <a href="#2">BaseFragment功能</a>

···· <a href="#2-0">BaseFragment 是什么</a>

···· <a href="#2-1">绑定 Layout 布局</a>

···· <a href="#2-2">FragmentChangeUtil</a>

···· <a href="#2-3">BaseFragment 最佳实践</a>

···· <a href="#2-4">BaseFragment 间的数据传递和回调</a>

· <a href="#3">设置、属性值的存储读取工具 Settings</a>

· <a href="#4">AppManager</a>

· <a href="#5">异步或同步(演示操作)</a>

· <a href="#6">BaseAdapter</a>

···· <a href="#6-1">JavaBean 适配方式</a>

···· <a href="#6-2">Map 适配方式</a>

···· <a href="#6-3">多种布局的绑定方式</a>

···· <a href="#6-4">数据刷新方法</a>

· <a href="#8">增强型日志</a>

· <a href="#7">行为与日志监听 + 不死的小强</a>

· <a href="#9">语言变更工具</a>

· <a href="#10">BaseApp功能</a>

···· <a href="#10-1">BaseApp提供的小工具</a>

<a name="1">BaseActivity功能</a>

<a name="1-0">沉浸式</a>

在 BaseActivity 中,您还可以使用以下注解对沉浸式进行控制:

@DarkStatusBarTheme(true)           //开启顶部状态栏图标、文字暗色模式
@DarkNavigationBarTheme(true)       //开启底部导航栏按钮暗色模式
@NavigationBarBackgroundColor(a = 255,r = 255,g = 255,b = 255)      //设置底部导航栏背景颜色(a = 0,r = 0,g = 0,b = 0可透明)
@NavigationBarBackgroundColorInt(-16777216)                         //设置底部导航栏背景颜色(颜色色值)
@NavigationBarBackgroundColorRes(R.color.black)                     //设置底部导航栏背景颜色(color资源Id)
@NavigationBarBackgroundColorHex("#FFFFFF")                         //设置底部导航栏背景颜色(颜色代码)

//也可从代码中进行控制:
setDarkStatusBarTheme(true);            //开启顶部状态栏图标、文字暗色模式
setDarkNavigationBarTheme(true);        //开启底部导航栏按钮暗色模式
setNavigationBarBackgroundColor(Color.argb(255,255,255,255));       //设置底部导航栏背景颜色(a = 0,r = 0,g = 0,b = 0可透明)

建议直接使用无 ActionBar 的 Activity 样式:

<!-- 在 res/values/styles.xml 中修改继承关系为:Theme.AppCompat.Light.NoActionBar -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<a name="1-1">绑定 Layout 布局</a>

BaseActivity 默认使用注解来绑定布局:

@Layout(R.layout.activity_demo)
public class DemoActivity extends BaseActivity {
    ...

⚠️ 新版本 Android Studio 默认将资源 id 不是 final 的导致无法直接在注解使用,此时可以尝试:

方案1:将资源 ID 编译为 final

前往 gradle.properties(Project Properties) 添加:

android.nonFinalResIds=false

Sync Project 即可。

方案2:使用资源名关联布局

@LayoutName("activity_demo")
public class DemoActivity extends BaseActivity {
    ...

或者使用 set 方法设置:

public DemoActivity() {
    setLayout(R.layout.activity_demo);
    setFragmentLayout(R.id.viewPager);
    setDarkStatusAndNavBarTheme(true);
    setNavigationBarBackgroundRes(R.color.colorWhite);
    setEnterAnim(R.anim.fade,R.anim.hold);
    setExitAnim(R.anim.hold,R.anim.back);
}

另外,如果你的布局资源名是与 Activity 名称反转相互对应的,例如 “DemoActivity” 的资源名是 “activity_demo” 此时也可以直接不设置,BaseActivity 会自动识别对应布局资源(限不开启资源名混淆的情况下使用)

此方法效率略低,如果介意可以尝试以下重写方法设置的方案:

不建议重写 onCreate 方法,根据约定,请无需关心绑定布局的过程,你只需要在 initView() 方法中绑定、加载 View 组件,initData() 方法中加载数据,在 setEvents() 方法中绑定事件即可。

除了注解绑定外,你也可以使用 resetLayoutResId() 方法重载布局资源,例如实现自定义主题:

@Override
protected int resetLayoutResId() {
    if (darkMode){
        return R.layout.activity_demo_dark;
    }else{
        return super.resetLayoutResId();
    }
}

额外的,你还可以拦截绑定过程,暂时不绑定布局(可能会出现错误,仅用于特殊情况):

@Override
public boolean interceptSetContentView() {
    return true;            //拦截绑定布局的过程
}

绑定 View 组件请参考 <a href="#1-8">布局绑定和事件绑定</a> 章节

<a name="1-2">跳转、Activity间通讯(带自定义参数的跳转)</a>

Android 默认的 Intent无法支持自定义类型参数的跳转,BaseActivity 通过自有的数据通道允许传输自定义类型的数据给要跳转到的另一个 BaseActivity:

跳转代码范例:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.img_bkg);
jump(JumpActivity.class, new JumpParameter()
        .put("参数1", "这是一段文字参数")
        .put("参数2", bmp)
);

接收数据代码范例:

String parameter1 = (String) getParameter().get("参数1");
if (!isNull(parameter1)) txtP1.setText("第一个参数读取到的值为:" + parameter1);
Bitmap parameter2 = (Bitmap) getParameter().get("参数2");
if (parameter2 != null) imgP2.setImageBitmap(parameter2);

<a name="1-3">更简单的跳转后返回数据</a>

以往我们需要通过重写实现 onActivityResult 来实现回传数据,但在 BaseActivity 中,你只需要一个监听器:

跳转代码范例:

jump(ResponseActivity.class, new OnJumpResponseListener() {
    @Override
    public void OnResponse(JumpParameter parameter) {
        if (parameter == null) {
            toast("未返回任何数据");
        } else {
            toast("收到返回数据,参数“返回数据1”中的值为:" + parameter.get("返回数据1"));
        }
    }
});

亦可选用同时带参数+返回值的跳转:

jump(ResponseActivity.class,new JumpParameter()
                .put("参数1", "这是一段文字参数")
                .put("参数2", "这是一段文字参数")
        , new OnJumpResponseListener() {
    @Override
    public void OnResponse(JumpParameter parameter) {
        if (parameter==null){
            toast("未返回任何数据");
        }else{
            toast("收到返回数据,参数“返回数据1”中的值为:" + parameter.get("返回数据1"));
        }
    }
});

返回数据范例:

if ((boolean) getParameter().get("needResponse") == true) {
    setResponse(new Parameter().put("返回数据1", "测试成功"));
}

//或也可以使用:
if ((boolean) getParameter().get("needResponse") == true) {
    returnParameter(new Parameter().put("返回数据1", "测试成功"));
}

<a name="1-4">权限申请</a>

请注意,申请权限依然需要先在你的 app 的 AndroidManifest.xml 中声明权限,然后使用以下代码可以快捷申请:

要申请权限,可使用以下代码进行:

Permission.build().LOCATION().get(new OnActivityPermissionCallBack<DemoActivity>() {
    @Override
    public void onSuccess(DemoActivity activity, String[] permissions) {
        toast("申请权限成功");
    }
    @Override
    public void onFail(DemoActivity activity) {
        toast("申请权限失败");
    }
});

Permission 类提供了一些常用的需要申请的权限类型,可连续使用叠加需要的权限,例如:

Permission.build()
        .PHONE_STATE()
        .LOCATION()
        .EXTERNAL_STORAGE()
        .get(new OnActivityPermissionCallBack<DemoActivity>() {
            @Override
            public void onSuccess(DemoActivity activity, String[] permissions) {
                
            }
        });

回调方法可选用 OnPermissionResponseListener 或者其新的实现 OnActivityPermissionCallBack,新的实现会返回申请权限时处于活跃状态的 BaseActivity,你也可以指定泛型,若指定了泛型,会在当前存在的对应类型的 BaseActivity 实例上申请权限。

过时的老方法:

要进行权限申请也变得更加简单,只需要实现相应的回调 OnPermissionResponseListener 即可:

requestPermission(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, new OnPermissionResponseListener() {
    @Override
    public void onSuccess(String[] permissions) {
        toast("申请权限成功");
    }
    @Override
    public void onFail() {
        toast("申请权限失败");
    }
});

<a name="1-5">BaseActivity提供的小工具</a>

//快速调用 Toast:
t

Related Skills

View on GitHub
GitHub Stars539
CategoryDevelopment
Updated1mo ago
Forks74

Languages

Java

Security Score

85/100

Audited on Feb 4, 2026

No findings