首页 > 其他分享 >Android dataBinding简单的封装

Android dataBinding简单的封装

时间:2023-06-19 14:05:55浏览次数:35  
标签:mBinding 封装 java androidx class dataBinding import Android android


一、简介

本文是databinding使用的简单封装,主要是在基类BaseActivity和BaseFragment中

二、具体步骤

1.在build.gradle中开启databinding

dataBinding { enabled = true }

2.在BaseActivity的封装,主要是通过反射的方式获取。如下

package com.zw.databindingdemo.java;

import android.os.Bundle;
import android.view.LayoutInflater;

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

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;

/**
 * 描述:
 * @author: dd
 * @time: 2023/6/8 16:33
 */
public abstract class BaseActivity<VB extends ViewDataBinding> extends AppCompatActivity {

    public VB mBinding;

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

    private void createBinding() {
        Class<VB> vbClass = getVbClass();
        try {
            if (vbClass == null) {
                return;
            }
            Method method = vbClass.getMethod("inflate", LayoutInflater.class);
            mBinding = (VB) method.invoke(null, getLayoutInflater());
            setContentView(mBinding.getRoot());
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    private Class<VB> getVbClass() {
        ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
        if (parameterizedType == null) {
            return null;
        }
        Class<VB> vbClass = (Class<VB>) parameterizedType.getActualTypeArguments()[0];
        return vbClass;
    }
}

3.在Activity中使用如下

package com.zw.databindingdemo.java;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import com.zw.databindingdemo.databinding.ActivityTestBinding;

/**
 * 描述:
 * @author: dd
 * @time: 2023/6/8 16:33
 */
public class TestActivity extends BaseActivity<ActivityTestBinding> {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding.tvName.setText("测试 java Activity");
        mBinding.btnGo.setOnClickListener(v -> {
            initFragment();
        });
    }

    private void initFragment() {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(mBinding.frameLayout.getId(), new TestFragment());
        ft.commit();

    }
}

4.在BaseFragment的封装

package com.zw.databindingdemo.java;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.Fragment;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;

/**
 * 描述:
 * @author: dd
 * @time: 2023/6/8 16:33
 */
public abstract class BaseFragment<VB extends ViewDataBinding> extends Fragment {


    public VB mBinding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        createBinding(inflater, container);
        return mBinding.getRoot();
    }

    private void createBinding(LayoutInflater inflater, ViewGroup container) {
        Class<VB> vbClass = getVbClass();
        try {
            if (vbClass == null) {
                return;
            }
         /*   Method method = vbClass.getMethod("inflate", LayoutInflater.class, ViewGroup.class, Boolean.class);*/
            Method method = vbClass.getMethod("inflate", LayoutInflater.class);
            mBinding = (VB) method.invoke(null, inflater);
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    private Class<VB> getVbClass() {
        ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
        if (parameterizedType == null) {
            return null;
        }
        return (Class<VB>) parameterizedType.getActualTypeArguments()[0];
    }
}

5.在Fragment的使用如下

package com.zw.databindingdemo.java;

import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.zw.databindingdemo.databinding.FragmentTestBinding;

/**
 * 描述:
 * @author: dd
 * @time: 2023/6/8 16:33
 */
public class TestFragment extends BaseFragment<FragmentTestBinding> {

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mBinding.tvName.setText("测试 java Fragment");
    }
}

6.Kotlin 版本

package com.zw.databindingdemo.kotlin

import android.os.Bundle
import android.view.LayoutInflater
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.ViewDataBinding
import java.lang.reflect.ParameterizedType

/**
 * 描述:
 * @author: dd
 * @time: 2023/6/8 16:33
 */
abstract class BaseActivityKotlin<VB : ViewDataBinding> : AppCompatActivity() {

    public lateinit var mBinding: VB

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = createBinding()
        setContentView(mBinding.root)
    }

    private fun createBinding(): VB {
        val vbClass = getVBClass()
        val method = vbClass.getMethod("inflate", LayoutInflater::class.java)

        return method.invoke(null, layoutInflater) as VB
    }

    @Suppress("UNCHECKED_CAST")
    private fun getVBClass(): Class<VB> {
        val type = javaClass.genericSuperclass as ParameterizedType
        return type.actualTypeArguments[0] as Class<VB>
    }
}
package com.zw.databindingdemo.kotlin

import android.os.Bundle
import com.zw.databindingdemo.databinding.ActivityTestKotlinBinding

/**
 * 描述:
 * @author: dd
 * @time: 2023/6/8 16:33
 */
class TestActivityKotlin: BaseActivityKotlin<ActivityTestKotlinBinding>() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mBinding.tvName.text = "测试 Kotlin Activity"
        mBinding.btnGo.setOnClickListener { initFragment() }
    }

    private fun initFragment() {
        val fm = supportFragmentManager
        val ft = fm.beginTransaction()
        ft.replace(mBinding.frameLayout.id, TestFragmentKotlin())
        ft.commit()
    }
}
package com.zw.databindingdemo.kotlin

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import java.lang.reflect.ParameterizedType

/**
 * 描述:
 * @author: dd
 * @time: 2023/6/8 16:33
 */
abstract class BaseFragmentKotlin<VB : ViewDataBinding> : Fragment() {


    public lateinit var mBinding: VB

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        mBinding = createBinding(inflater, container)
        return mBinding.root
    }

    private fun createBinding(inflater: LayoutInflater, container: ViewGroup?): VB {
        val vbClass = getVBClass()
        val method = vbClass.getMethod(
            "inflate",
            LayoutInflater::class.java,
            ViewGroup::class.java,
            Boolean::class.java
        )

        return method.invoke(null, inflater, container, false) as VB
    }

    @Suppress("UNCHECKED_CAST")
    private fun getVBClass(): Class<VB> {
        val type = javaClass.genericSuperclass as ParameterizedType
        return type.actualTypeArguments[0] as Class<VB>
    }

}
package com.zw.databindingdemo.kotlin

import android.os.Bundle
import android.view.View
import com.zw.databindingdemo.databinding.FragmentTestKotlinBinding

/**
 * 描述:
 * @author: dd
 * @time: 2023/6/8 16:33
 */
class TestFragmentKotlin : BaseFragmentKotlin<FragmentTestKotlinBinding>() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mBinding.tvName.text = "测试 Kotlin Fragment"
    }
}


标签:mBinding,封装,java,androidx,class,dataBinding,import,Android,android
From: https://blog.51cto.com/u_16163442/6512793

相关文章

  • [Android] NFC数据传输
    Android的nfc采用的什么格式传输数据Android系统中的NFC模块通常使用NDEF(NFCDataExchangeFormat)格式来传输数据。NDEF格式是一种轻量级的数据交换格式,它用于定义NFC标签中的数据结构。NDEF格式使用一组记录来表示数据,每条记录包含三部分:记录类型(recordtype)、记......
  • 【Android面试】2023最新面试专题四:Java核心基础(上)
    1Java中提供了抽象类还有接口,开发中如何去选择呢?这道题想考察什么?Java是面向对象编程的,抽象是它的一大特征,而体现这个特征的就是抽象类与接口。抽象类与接口某些情况下都能够互相替代,但是如果真的都能够互相替代,那Java为何会设计出抽象与接口的概念?这就需要面试者能够掌握两者的区......
  • Android应用开发者,你们真的了解Activity的生命周期吗?
    一开始,我觉得Activity的生命周期虽然过于复杂,但它不应该是一个难题。我的意思是:对于Android开发新手来说,如何正确地处理Activity生命周期可能有点困难,但是我无法想象对于那些富有经验的android开发者来说,这依然是一个棘手的问题。我还是想的太简单了。一会儿我会告诉你整个故事,但是......
  • 【Android面试】2023年Android中高级最全面试题,轻松拿offer
    前言2023年的金三银四来了,不知道大家准备好了没?对于程序员而言,无论是想加快个人技能成长速度,或是想要升职涨薪,都需要不断进阶,跳槽到规模与业务更大、并且有成熟的技术成长体系的公司当中去。而想要跳槽成功,面试可以说是决定性因素。这里给大家整理了一份935页的《2023年Android中高......
  • 使用 koin 作为 Android 注入工具,真香
    koin为Android提供了简单易用的API接口,让你简单轻松地接入koin框架。[koin在Android中的gradle配置]mp.weixin.qq.com/s/bscC7mO4O…1.Application类中startKoin从您的类中,您可以使用该函数并注入Android上下文,如下所示:ApplicationstartKoinandroidContextclass......
  • 收藏向 | 车载Android系统开发学习专题,进军车载必备
    如今,智能手机已无处不在,移动操作系统开始向新的领域扩张,这其中,就有近段时间被苹果CarPlay催热的车载系统。目前全球的汽车数量已经超过10亿辆,但车载系统却仍然有非常大的提升空间。汽车厂商们也早已意识到了车载对于未来汽车市场的重要性,开始布局更加智能的车载系统,让自己的汽车能......
  • uniapp封装接口
    1.创建一个config文件夹,在里面创建app.jslethttpApi=''//接口公共部分module.exports={//要传的请求头token等HTTP_REQUEST_URL:httpApi,HEADER:{Headers,Authorization:'token','i-branch':'zh'},//......
  • 如何有效阅读源码?最新Android开发源码精编解析,优秀程序员必备
    大多数人阅读源码是为了应对面试中可能会提到的相关问题,提高面试的成功率,因此选择源码相关的书籍和视频来看是速成的最好方法。但对于想真正提高编码水平,让自己的事业更上一层楼的开发者而言,只有下功夫、花时间,才能有所突破。不过大家也清楚,阅读源码是比较困难的,尤其是对于项目背景......
  • 2022最全面&详细的Android学习指南,零基础快速入门的通道
    随着Android技术栈的不断扩展,不少新的技术如Flutter、RN、小程序等涌入我们的视野,也有越来越多的人投身入Android开发的赛道。无论你是35岁正在遭遇中年职业危机的程序员,还是刚刚毕业的大学生/研究生,想走技术这条路,都需要不断学习,风雨兼程!那么,如何系统的学习Android呢?首先来看看And......
  • Android进阶宝典 -- JetPack Navigation的高级用法(解决路由跳转新建Fragment页面问题)
    相信有相当一部分的伙伴,在项目开发中依然使用Activity作为页面承载体,有10个页面就会有10个Activity,这种方式当然没问题,但是如果涉及到页面间数据共享,那么使用多Activity就不是很方便了,需要Activity传递各种数据,涉及到数据的序列化与反序列化;因此产生了单Activity和多Fragment架构,所......