Android Studio-适用于多个视图的相同onClick功能



所以我想创建一个函数来更改调用该函数的视图的色调。

我很确定我已经放下了色调部分,我只是不太确定我需要如何或在哪里定义这个函数,这样我就可以在内置属性菜单中选择它作为onClick方法,也可以在xml文件中引用它(最好是前者(。

现在,我在类内的MainActivity.kt文件中有这个函数,我在属性菜单中的所有不同视图上都选择了这个函数,但当我运行应用程序并实际点击这些视图时,我会崩溃地说";在android的父或祖先上下文中找不到方法:onClick属性";

我真的很感谢你的帮助,提前谢谢!

您可以为多个视图设置相同的点击侦听器。

val tintChanger = View.OnClickListener { view ->
println("View with id=${view.id} clicked")
changeTintOf(view as ImageView)
}
imageViewOne.setOnClickListener(tintChanger)
imageViewTwo.setOnClickListener(tintChanger)
imageViewThree.setOnClickListener(tintChanger)

如何在不知道视图id的情况下设置视图的点击侦听器?

val imageContainerLayout = findViewById<LinearLayout>(R.id.imageContainer)
// val imageContainerLayout = binding.imageContainer
imageContainerLayout.children.forEach {
it.setOnClickListener(tintChanger)
}
// xml
<LinearLayout
android:id="@+id/imageContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>

<ImageView ... /> // without android:id set
<ImageView ... /> // without android:id set
<ImageView ... /> // without android:id set
</LinearLayout>

现在不是首选方式,但如果您想通过xml在视图上设置一个点击侦听器,那么您的活动应该包含一个带有参数view: View的公共方法changeTintOnClick

// MainActivity.kt
fun changeTintOnClick(view: View) {
println("View click listener set by XML")
println("View clickView with id=${view.id} clicked")

changeTintOf(view as ImageView)
}
private fun changeTintOf(view: ImageView) {
// your implementation for tint
}
<ImageView ...
android:onClick="changeTintOnClick" 
/>

实现这一点的一种方法是在主活动类上放置一个OnClickListener扩展,并使用id和标记设置所有视图以供以后引用。

class MainActivity : AppCompatActivity(), View.OnClickListener{ /*Extend class to conformalso to View.OnClickListsner*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) 
}
//Let's say you have two or more views to use.
//You want to include the same listener to all opf the same buttons you want to use
findViewById<Button>(R.id.myelementone).setOnClickListener(this)
findViewById<Button>(R.id.myelementTwo).setOnClickListener(this)
override fun onClick(v: View) {
switch(v.tag){
case "myelementonetag":
//Do something
break;
case "myelementtwotag"
//Do something else
break;
default:
//If no tags match the clicked item
break;
}
}
}

在XML中,你真正需要做的唯一一件事就是像这样设置元素的id和元素的标签(在XML中使用onClick不再是最佳实践,建议不要再使用它了。别忘了为你自己的按钮保留它们的样式!(:

<Button
android:id="@+id/myelementone"
tag="myelementonetag"/>
<Button
android:id="@+id/myelementone"
tag="myelementonetag"/>

如果你需要更多关于它是如何工作的,这里有另一个StackOverflow问题,它用所有最好的方法来实现点击功能:Android-如何在Kotlin中实现setOnClickListener?

最新更新