android - BaseFragment 与视图绑定
问题描述
要viewbinding
在 android 应用程序中使用,我基本上是在为Activity
&Fragment
删除每次编写膨胀代码的样板文件创建基类。
活动:
BaseActivity
与viewbinding
:
abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = getViewBinding()
}
abstract fun getViewBinding(): VB
}
MainActivity
:
class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
//we can directly use binding now and it works fine inside activity
//binding.view.doSomething()
}
override fun getViewBinding(): ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)
}
片段:
BaseFragment
:
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
var binding: VB? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = getViewBinding(view)
}
abstract fun getViewBinding(view: View): VB
}
DemoFragment
:
class DemoFragment : BaseFragment<DemoFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//problem is here
binding.txtData.text="Something"
}
override fun getViewBinding(view: View): DemoFragmentBinding = DemoFragmentBinding.bind(view)
}
demo_fragment.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.fragments.DemoFragment">
<TextView
android:id="@+id/txt_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello" />
</FrameLayout>
问题:无法使用 Demofragment 中的绑定访问视图。我不知道为什么它适用于活动而不适用于片段。
我不想做的第二种方式:
实现'androidx.fragment:fragment-ktx:1.3.1'
class DemoFragment : Fragment(R.layout.demo_fragment) {
lateinit var binding: DemoFragmentBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = DemoFragmentBinding.bind(view).apply {
txtData.text = "Hello World"
}
}
}
解决方案
您需要onCreateView
在 BaseFragment 中覆盖并初始化视图绑定
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = getViewBinding()
return binding.root
}
然后改变这一行
override fun getViewBinding(view: View): DemoFragmentBinding = DemoFragmentBinding.bind(view)
和
override fun getViewBinding() = DemoFragmentBinding.inflate(layoutInflater)
基本片段:
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
private var _binding: VB? = null
val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = getViewBinding()
return binding.root
}
abstract fun getViewBinding(): VB
}
演示片段:
class DemoFragment : BaseFragment<DemoFragmentBinding>() {
override fun getViewBinding() = DemoFragmentBinding.inflate(layoutInflater)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.apply {
txtData.text = "Something"
}
}
}
推荐阅读
- php - 更新无线电类型的多条记录
- python - 使用 Python 从 Eurostat 提取数据时出现值错误
- exacttarget - Salesforce Markting Cloud (ExactTarget) 的 Rest api 从父业务部门返回类别
- symfony4 - symfony 4.4 + FOSCKEditor + helios-agElfinder 不工作
- string - 如何从 Scala 中的字符串中删除子字符串/字符?
- c# - 从 FileStream 获取元数据
- graphql - GraphQL 错误:Float 类型的可变价格用于预期 float8 的位置
- java - spring data mongo 不能 pikup 自定义 ZonedDateTime 转换器,为什么?
- vba - 你能告诉我这是怎么回事吗?“VBA 网络登录”,它不起作用
- javascript - V8 是否只编译我们想要运行的代码?