【问题标题】:Can't get access to Views by DataBinding or Android Extensions无法通过 DataBinding 或 Android 扩展访问视图
【发布时间】:2021-04-28 00:02:36
【问题描述】:

我无法通过 DataBinding 或 Android 扩展更改 View 的值,但它可以通过“传统方式”(findViewById) 工作。此外,当我在没有安全调用运算符的情况下通过 Android Extensions 的方式尝试时,它会引发 NPE。

HourlyFragment.kt

class HourlyFragment : Fragment() {

private lateinit var binding: FragmentHourlyBinding

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    var rootView = inflater.inflate(R.layout.fragment_hourly, container, false)

    binding = DataBindingUtil.inflate(
        inflater, R.layout.fragment_hourly, container, false
    )

    // doesn't work
    //binding.tvHourly.text = "HOURLY!"

    val tvHourly : TextView = rootView.findViewById(R.id.tv_hourly)
    tvHourly.setText("HOURLY!!")

    // doesn't work, without safe call operator throws NullPointerException
    //tv_hourly?.text = "HOURLY!!!"

    return rootView
}

}

fragment_hourly.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".fragments.HourlyFragment">


        <TextView
            android:id="@+id/tv_hourly"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="hourly fragment" />

    </FrameLayout>
</layout>

【问题讨论】:

    标签: android kotlin android-fragments data-binding android-view


    【解决方案1】:

    目前你正在夸大你的观点两次,这导致了我认为的所有问题,所以只需夸大你的观点一次,看看它是否能解决你的问题

    试试下面的

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
    
     // var rootView = inflater.inflate(R.layout.fragment_hourly, container, false)
    
        binding = DataBindingUtil.inflate(
            inflater, R.layout.fragment_hourly, container, false
        )
    
        binding.tvHourly.text = "HOURLY!"
    
       // val tvHourly : TextView = rootView.findViewById(R.id.tv_hourly)
        tvHourly.setText("HOURLY!!")
    
       
    
        return binding.root
    }
    

    【讨论】:

      【解决方案2】:

      为什么您的数据绑定不起作用:

      你正在用线手动充气

      var rootView = inflater.inflate(R.layout.fragment_hourly, container, false)
      

      但随后您使用数据绑定在下一行代码中扩展此层次结构的另一个副本。然后从onCreateView 返回第一个布局,丢弃第二个膨胀的数据绑定布局。您更改了数据绑定布局中的视图文本,然后将其丢弃。

      为什么您的 Android 扩展程序不起作用:

      onCreateView() 返回之前,您不能使用合成视图引用,因为 Fragment 仍然没有任何附加视图供合成属性用于查找子视图。

      您应该改为修改 onViewCreated() 中的视图内容。

      顺便说一句,Android Extensions 已弃用,不应再使用。

      【讨论】:

        【解决方案3】:

        以更简洁、更易读的方式:

        
        private lateinit var binding: FragmentHourlyBinding
        
        override fun onCreateView(
                inflater: LayoutInflater, 
                container: ViewGroup?,
                savedInstanceState: Bundle?
        ): View? {
        
            binding = FragmentHourlyBinding.inflate(
                inflater, container, false
            ).apply {
                tvHourly.text = "HOURLY!"
            }
        
            return binding.root
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-19
          • 2014-02-14
          • 1970-01-01
          相关资源
          最近更新 更多