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

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

但是,当我将 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))
        }
      }
   }

【问题讨论】:

    标签: android kotlin binding


    【解决方案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
          ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2018-03-25
      相关资源
      最近更新 更多