【问题标题】:About viewbinding关于视图绑定
【发布时间】:2021-02-23 07:49:30
【问题描述】:

我想问一下ViewBinding。

官方

 buildFeatures{
        viewBinding = true
    }

但它不起作用。

这是一个示例代码。

布局代码

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/floatingActionButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="24dp"
        android:layout_marginBottom="24dp"
        android:clickable="true"
        android:focusable="true"
        android:tint="@color/white"
        android:src="@drawable/ic_add"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

Kotlin 代码

val view = inflater.inflate(R.layout.fragment_list, container, false)

        view.floatingActionButton.setOnClickListener { }

这个问题有什么解决办法吗? 我不知道为什么它不起作用。

Android 工作室 Vierson4.1.2 Gradle 视觉 6.5

【问题讨论】:

    标签: android kotlin android-viewbinding


    【解决方案1】:

    你需要在layout.xml中作为父级使用

    示例:- my_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="@dimen/_4sdp">
    
        <TextView
            android:id="@+id/scanner"
            android:layout_width="@dimen/_200sdp"
            android:layout_height="@dimen/_200sdp"
            android:layout_centerInParent="true"
            app:squaredFinder="true" />
    </RelativeLayout>
    
    </layout>
    

    在 Kotlin 中。

    val binding = DataBindingUtil.inflate(android.view.LayoutInflater.from(context), R.layout.my_layout, null, false);
    

    【讨论】:

    • 在使用视图绑定时不需要使用layout 标签。
    【解决方案2】:

    这是启用视图绑定的方式

     private var _binding: FragmentListBinding? = null
        // This property is only valid between onCreateView and
        // onDestroyView.
        private val binding get() = _binding!!
     override fun onCreateView(
                inflater: LayoutInflater,
                container: ViewGroup?,
                savedInstanceState: Bundle?
        ): View? {
            _binding = FragmentListBinding.inflate(inflater, container, false)
        
        binding.floatingActionButton.setOnClickListener { }
        return binding.root
    

    片段比他们的观点更长寿。确保清除片段的 onDestroyView() 方法中对绑定类实例的所有引用。

    override fun onDestroyView() {
            super.onDestroyView()
    
            _binding = null
        }
    

    更多详情,read

    【讨论】:

      【解决方案3】:

      像这样试试。

      class BaseActivity : AppCompatActivity(){
      
      private lateinit var binding: (YourActivityBinding)
      
      super.onCreate(savedInstanceState){
       binding = YourActivityBinding.inflate(layoutInflater)
       setContentView(binding.root)
       binding.floatingActionButton.setOnClickListener (View.OnClickListener{ 
            })
         }
       }  
      

      【讨论】:

        【解决方案4】:

        试试这个。在你的 Gradle(模块)中:

        android{
        .
        .
        .
        buildFeatures {
            dataBinding true
         }
        }
        

        同步后,在您的 XML 文件中,尝试在您的布局父级和选项上按下 (ALT+Enter)

        转换为数据绑定

        现在在你的活动中

        class MainActivity : AppCompatActivity() {
        
        lateinit var binding: ActivityMainBinding
        
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
         }
        }
        

        或者在你的片段中:

        class BlankFragment: Fragment() {
        private lateinit var binding: FragmentBlankBinding
        
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            binding = FragmentBlankBinding.inflate(inflater)
            return binding.root
        }
        

        从现在开始,对于绑定视图,你应该这样写:

        binding.textView.text = "test"
        

        【讨论】:

        • 问题是关于视图绑定,而不是数据绑定。
        • @VarshaKulkarni 此方法涵盖两者。特别是如果您使用 MVVM 结构。
        • 但是如果你不需要使用数据绑定,那么这对于视图绑定是行不通的。
        【解决方案5】:

        感谢您的精彩回答。 我忘了创建一个绑定类。 我能够成功解决问题,并且错误已解决。

        添加代码

        private var _binding: FragmentListBinding? = null
            private val binding get() = _binding!!
        
            override fun onCreateView(
                inflater: LayoutInflater, container: ViewGroup?,
                savedInstanceState: Bundle?
            ): View? {
                // Inflate the layout for this fragment
                _binding = FragmentListBinding.inflate(inflater, container, false)
        
                binding.floatingActionButton.setOnClickListener {
        
                }
        
                return binding.root
            }
        

        【讨论】:

          猜你喜欢
          • 2011-07-14
          • 1970-01-01
          • 1970-01-01
          • 2020-11-18
          • 2015-04-09
          • 2013-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多