KOTLIN:如何使用 ViewBinding 在函数内调用视图
KOTLIN :How To Call a View within a Function Using ViewBinding
所以随着新的 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}.")
}
}
这里出现错误:
请提供准确的步骤
@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):
在 activity 中的 onCreate
函数中,移除对 setContentView
的重复调用:
...
setContentView(R.layout.activity_job) /* remove this if you're using view binding */
binding = ActivityJobBinding.inflate(layoutInflater)
setContentView(binding.root)
你应该删除这一行:
setContentView(R.layout.activity_job)
如果不使用 ViewBinding,您可以通过在 Gradle 中添加此插件来使用 Kotlin Android 扩展:
apply plugin: 'kotlin-android-extensions'
只需通过其 ID 调用视图即可!
例如,对于具有这行代码的 TextView:
android:id="@+id/welcomeMessage"
您可以轻松调用:
welcomeMessage.text = "Hello Kotlin!"
1.First 首先,删除多余且不必要的 OnCreate 方法:
setContentView(R.layout.activity_job)
2.You 可以决定通过添加此行(ps:这是更新的方式,通过各自的 ID 返回到 activity 中调用视图的初始 Kotlin 方法在新的 kotlin 版本 1.4.0 中添加插件:
plugins {
id 'kotlin-android'
id 'kotlin-android-extensions'
}
使用此方法,可以按原来的方式进行,但有轻微警告,您可能容易调用空操作。
所以随着新的 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}.")
}
}
这里出现错误:
请提供准确的步骤
@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):
在 activity 中的 onCreate
函数中,移除对 setContentView
的重复调用:
...
setContentView(R.layout.activity_job) /* remove this if you're using view binding */
binding = ActivityJobBinding.inflate(layoutInflater)
setContentView(binding.root)
你应该删除这一行:
setContentView(R.layout.activity_job)
如果不使用 ViewBinding,您可以通过在 Gradle 中添加此插件来使用 Kotlin Android 扩展:
apply plugin: 'kotlin-android-extensions'
只需通过其 ID 调用视图即可! 例如,对于具有这行代码的 TextView:
android:id="@+id/welcomeMessage"
您可以轻松调用:
welcomeMessage.text = "Hello Kotlin!"
1.First 首先,删除多余且不必要的 OnCreate 方法:
setContentView(R.layout.activity_job)
2.You 可以决定通过添加此行(ps:这是更新的方式,通过各自的 ID 返回到 activity 中调用视图的初始 Kotlin 方法在新的 kotlin 版本 1.4.0 中添加插件:
plugins {
id 'kotlin-android'
id 'kotlin-android-extensions'
}
使用此方法,可以按原来的方式进行,但有轻微警告,您可能容易调用空操作。