Android中dataBinding使用的簡(jiǎn)單封裝
一、簡(jiǎn)介
本文是databinding使用的簡(jiǎn)單封裝,主要是在基類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: zw
* @time: 2023/5/22 17: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: zw
* @time: 2023/5/22 17:33
*/
public class TestActivity extends BaseActivity<ActivityTestBinding> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding.tvName.setText("測(cè)試 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: zw
* @time: 2023/5/22 17: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: zw
* @time: 2023/5/22 17:33
*/
public class TestFragment extends BaseFragment<FragmentTestBinding> {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mBinding.tvName.setText("測(cè)試 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: zw
* @time: 2023/5/22 17: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: zw
* @time: 2023/5/22 17:33
*/
class TestActivityKotlin: BaseActivityKotlin<ActivityTestKotlinBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding.tvName.text = "測(cè)試 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: zw
* @time: 2023/5/22 17: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: zw
* @time: 2023/5/22 17:33
*/
class TestFragmentKotlin : BaseFragmentKotlin<FragmentTestKotlinBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mBinding.tvName.text = "測(cè)試 Kotlin Fragment"
}
}總結(jié)
到此這篇關(guān)于Android中dataBinding使用的簡(jiǎn)單封裝的文章就介紹到這了,更多相關(guān)Android dataBinding封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android畢業(yè)設(shè)計(jì)記事本APP
這篇文章主要介紹了一個(gè)Android畢業(yè)設(shè)計(jì)記事本APP,它是一款輕量級(jí)的便簽工具,使用Java語言開發(fā),風(fēng)格簡(jiǎn)練,可實(shí)現(xiàn)便簽的添加、刪除、修改、查看功能2021-08-08
Android中 自定義數(shù)據(jù)綁定適配器BaseAdapter的方法
本篇文章小編為大家介紹,Android中 自定義數(shù)據(jù)綁定適配器BaseAdapter的方法。需要的朋友參考下2013-04-04
android實(shí)現(xiàn)音樂播放器進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)音樂播放器進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Android圓形頭像拍照后“無法加載此圖片”的問題解決方法(適配Android7.0)
這篇文章主要介紹了Android圓形頭像拍照后“無法加載此圖片”的問題解決方法(適配Android7.0) ,需要的朋友可以參考下2017-10-10
學(xué)習(xí)使用Android Chronometer計(jì)時(shí)器
Chronometer是一個(gè)簡(jiǎn)單的計(jì)時(shí)器,你可以給它一個(gè)開始時(shí)間,并以計(jì)時(shí),或者如果你不給它一個(gè)開始時(shí)間,它將會(huì)使用你的時(shí)間通話開始,這篇文章主要幫助大家學(xué)習(xí)掌握使用Android Chronometer計(jì)時(shí)器,感興趣的小伙伴們可以參考一下2016-04-04
Android使用libgdx實(shí)現(xiàn)模擬方向鍵控制角色移動(dòng)的方法
這篇文章主要介紹了Android使用libgdx實(shí)現(xiàn)模擬方向鍵控制角色移動(dòng)的方法,實(shí)例分析了Android中使用libgdx框架實(shí)現(xiàn)響應(yīng)方向鍵的技巧,適用于Android游戲開發(fā)領(lǐng)域,需要的朋友可以參考下2015-12-12

