Android中dataBinding使用的簡(jiǎn)單封裝
一、簡(jiǎn)介
本文是databinding使用的簡(jiǎn)單封裝,主要是在基類(lèi)BaseActivity和BaseFragment中
二、具體步驟
1.在build.gradle中開(kāi)啟databinding
dataBinding { enabled = true }
2.在BaseActivity的封裝,主要是通過(guò)反射的方式獲取。如下
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語(yǔ)言開(kāi)發(fā),風(fēng)格簡(jiǎn)練,可實(shí)現(xiàn)便簽的添加、刪除、修改、查看功能2021-08-08Android中 自定義數(shù)據(jù)綁定適配器BaseAdapter的方法
本篇文章小編為大家介紹,Android中 自定義數(shù)據(jù)綁定適配器BaseAdapter的方法。需要的朋友參考下2013-04-04android實(shí)現(xiàn)音樂(lè)播放器進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)音樂(lè)播放器進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Android圓形頭像拍照后“無(wú)法加載此圖片”的問(wèn)題解決方法(適配Android7.0)
這篇文章主要介紹了Android圓形頭像拍照后“無(wú)法加載此圖片”的問(wèn)題解決方法(適配Android7.0) ,需要的朋友可以參考下2017-10-10學(xué)習(xí)使用Android Chronometer計(jì)時(shí)器
Chronometer是一個(gè)簡(jiǎn)單的計(jì)時(shí)器,你可以給它一個(gè)開(kāi)始時(shí)間,并以計(jì)時(shí),或者如果你不給它一個(gè)開(kāi)始時(shí)間,它將會(huì)使用你的時(shí)間通話(huà)開(kāi)始,這篇文章主要幫助大家學(xué)習(xí)掌握使用Android Chronometer計(jì)時(shí)器,感興趣的小伙伴們可以參考一下2016-04-04Android使用libgdx實(shí)現(xiàn)模擬方向鍵控制角色移動(dòng)的方法
這篇文章主要介紹了Android使用libgdx實(shí)現(xiàn)模擬方向鍵控制角色移動(dòng)的方法,實(shí)例分析了Android中使用libgdx框架實(shí)現(xiàn)響應(yīng)方向鍵的技巧,適用于Android游戲開(kāi)發(fā)領(lǐng)域,需要的朋友可以參考下2015-12-12