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