【问题标题】:KOTLIN :How To Call a View within a Function Using ViewBindingKOTLIN :如何使用 ViewBinding 在函数中调用视图
【发布时间】:2020-11-16 17:09:31
【问题描述】:

因此,随着新的 Kotlin,Android Studio 更新,不可能像规范那样使用各自的 ID 调用视图,因此视图绑定。 但是,我一直在尝试使用绑定方法在函数内部调用上述视图,但没有成功,因为它一直返回错误

下面是代码:

class JobActivity : AppCompatActivity() {

private val PROGRESS_MAX = 100
private val PROGRESS_START = 0
private val JOB_TIME = 4000 // ms

private lateinit var job: CompletableJob

private lateinit var binding: ActivityJobBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_job)


    binding = ActivityJobBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.jobbutton.setOnClickListener {
        if (!::job.isInitialized  ){
            initjob()
        }
    }

}


fun initjob(){
    binding.jobbutton.setText("StartJob #1")
    binding.textView2.setText("")
    job= Job()
    job.invokeOnCompletion {
        it?.message.let {
            var msg = it
            if (msg.isNullOrBlank()){
                msg ="Uknown cancellation Error"
            }
            println("${job} was cancelled. Reason:$msg")
            showtoast(msg)
        }
    }
    binding.progressBar.max= PROGRESS_MAX
    binding.progressBar.progress= PROGRESS_START

}
fun showtoast(text:String){
    Toast.makeText(this@JobActivity, text,Toast.LENGTH_SHORT).show()
}
  }
fun ProgressBar.startJobOrCancel(job: Job) {
if (this.progress > 0) {
    Log.d(TAG, "${job} is already active. Cancelling...")
    resetjob()
} else {
    binding.jobbutton.setText("StartJob #1")
    Log.d(TAG, "coroutine ${this} is activated with job ${job}.")

}
}

错误发生在这里:

请提供准确的步骤

【问题讨论】:

    标签: android kotlin android-view android-viewbinding


    【解决方案1】:

    @GabrielFranciss

    嗯,我认为绑定对象在扩展函数之外无法识别,您必须将绑定添加为参数,或者创建一个可以在扩展函数执行和结束时调用的 lambda 函数。

    fun ProgressBar.startJobOrCancel(job:Job, jobStarted: () -> Unit ) {
      when {
        this.progress > 0 -> {
          //log
          resetJob()
        }
        else -> {
          jobFinished()
        }
      }
    } 
    

    并使用activity/fragment中的函数如下:

      private var job = Job()
      private var scope = CoroutineScope(Dispatchers.Default+job)
      /* inside initJob() ... */
      job = scope.launch(){
        binding.progress.startJobOrCancel(job) {
          binding.jobbutton.setText("StartJob #1")
        }
      }
    
    

    更新(2020-11-17):

    在活动内的onCreate函数上,删除对setContentView的重复调用:

      ...
      setContentView(R.layout.activity_job) /* remove this if you're using view binding */
      binding = ActivityJobBinding.inflate(layoutInflater)
      setContentView(binding.root)
    

    【讨论】:

    • @Marlom Lopez 一个问题,我们将如何使用绑定来调用它,我已经诚实地尝试过您的方法,但它不起作用。
    • @marlon lopez,请展示您如何将绑定添加为参数
    • @SaginiChan 绑定没有作为参数添加,我的意思是,在 sn-p 中,我使用 lambda 函数作为参数(又名高阶函数),有了这个函数在执行 Job 的函数内部调用。在 UI 屏幕中,高阶函数的使用可能类似于 java 方法中匿名接口的使用。 (续...)
    • @SaginiChan (cont...) 您可以查看 kotlin 文档以了解将 lambdas 用作函数参数 (kotlinlang.org/docs/reference/lambdas.html) ...
    • @GabrielFranciss ... 绑定对象用于高阶函数的实现,在扩展函数中作为参数传递。我使用了与您共享的相同代码来使用该函数。所以,很容易理解。请记住,作业是作为协程执行的,因此,您可以检查在扩展函数上执行的函数是否在 ui 范围内调用
    【解决方案2】:

    1.首先,去掉 OnCreate 方法的多余和不必要的:

    setContentView(R.layout.activity_job)
    

    2.您可以决定回到最初的 Kotlin 方法,通过添加此行来通过各自的 ID 在 Activity 中调用视图(ps:这是在新的 kotlin 版本 1.4.0 中添加插件的更新方式:

    plugins {
        id 'kotlin-android'
        id 'kotlin-android-extensions'
    }
    

    使用此方法,可以按照原来的方式进行操作,但有轻微警告,您可能容易调用空操作。

    【讨论】:

      【解决方案3】:

      你应该删除这一行:

      setContentView(R.layout.activity_job)
      

      在不使用 ViewBinding 的情况下,您可以通过在 Gradle 中添加此插件来使用 Kotlin Android 扩展:

       apply plugin: 'kotlin-android-extensions'
      

      只需通过 id 调用 view! 例如使用这行代码的 TextView:

       android:id="@+id/welcomeMessage"
      

      您可以轻松调用:

      welcomeMessage.text = "Hello Kotlin!"
      

      【讨论】:

      猜你喜欢
      • 2023-01-10
      • 2020-02-09
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2021-05-20
      • 2020-02-13
      相关资源
      最近更新 更多