Kotlin / 迁移到视图绑定

Posted

技术标签:

【中文标题】Kotlin / 迁移到视图绑定【英文标题】:Kotlin / Migration to View Binding 【发布时间】:2021-10-03 00:28:32 【问题描述】:

我一直在关注 YT 视频制作测验应用程序,但最后我在绑定时遇到了这个错误:

“kotlin-android-extensions”Gradle 插件已弃用。 请使用此迁移指南 (https://goo.gle/kotlin-android-extensions-deprecation) 开始使用视图绑定 (https://developer.android.com/topic/libraries/view-binding) 和“kotlin-parcelize”插件。

但是,当我将 binding 例如添加到 tv_name.text 时,我确实收到了错误,即 text 期待变量并且一切都与其他装订部分。

库部分

import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import com.example.quizapp.databinding.ActivityResultBinding

代码部分

    class ResultActivity : AppCompatActivity() 

    private val binding by viewBinding(FragmentResultActivity::bind)

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_result)

        // Hide the status bar.
        //window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN

        val userName = intent.getStringExtra(Constants.USER_NAME)
        binding.tv_name.text = userName

        val totalQuestions = intent.getIntExtra(Constants.TOTAL_QUESTIONS, 0)
        val correctAnswers = intent.getIntExtra(Constants.CORRECT_ANSWERS, 0)

        binding.tv_score.text = "Your Score is $correctAnswers out of $totalQuestions."

        binding.btn_finish.setOnClickListener 
            startActivity(Intent(this@ResultActivity, MainActivity::class.java))
        
      
   

【问题讨论】:

【参考方案1】:

您需要正确初始化绑定变量。请使用以下代码:

class ResultActivity : AppCompatActivity() 

    private lateinit var binding: ActivityResultBinding

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        binding = ActivityResultBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Hide the status bar.
        //window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN

        val userName = intent.getStringExtra(Constants.USER_NAME)
        binding.tv_name.text = userName

        val totalQuestions = intent.getIntExtra(Constants.TOTAL_QUESTIONS, 0)
        val correctAnswers = intent.getIntExtra(Constants.CORRECT_ANSWERS, 0)

        binding.tv_score.text = "Your Score is $correctAnswers out of $totalQuestions."

        binding.btn_finish.setOnClickListener 
            startActivity(Intent(this@ResultActivity, MainActivity::class.java))
        
      
    

由于我没有您的资源,我认为您可能需要更改ActivityResultBinding 的命名。不过,我很确定就是这样。

编码愉快! :)

【讨论】:

感谢您的回答,但不幸的是,我确实遇到了同样的错误,对于“ActivityResultBinding”,我得到了未解决的参考 你启用视图绑定了吗? @georkost viewBinding 和 in buildFeatures 在里面也启用了 您看到生成了任何 xxBinding 类吗?如果启用了视图绑定,那么您应该会看到一些类 我认为它不会显示为tv_name,而是显示为 tvname 或 tvName。当您执行binding. 时您会看到什么,IDE 是否会自动为您提供一些选项?【参考方案2】:

首先你需要让安卓知道你正在使用视图绑定。所以转到“Gradle Scripts”文件夹并打开应用程序级别build.gradle(Module:nameOfProject) 文件并在android 属性中添加:

android 

// ------ VIEW BINDING SETTING ------
// this creates the binding object
buildFeatures
    viewBinding true

// after set up, click on  "Sync Now"

然后在MainActivity.kt:

class MainActivity : AppCompatActivity() 
    // Initialize binding object. if ActivityMainBinding is not ready in menu click "Build/Make project"
    private lateinit var binding:ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        // view Bindig
//        binding default layout inflater
        binding= ActivityResultBinding.inflate(layoutInflater)
        // inflate the root views which is Linear Layout, we access with .root
        setContentView(binding.root)

        // Set click listeners
      ....

【讨论】:

以上是关于Kotlin / 迁移到视图绑定的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Android 视图绑定:findViewById vs Butterknife vs Kotlin Android Extension

Kotlin 2路绑定自定义视图

工具栏中的问题设置颜色(android-kotlin)

如何使用 Kotlin 的视图绑定在 Android 中缩短此代码?

使用绑定从片段访问父活动的 UI 元素

开始迁移到 Kotlin | Kotlin 迁移指南 (中篇)