【问题标题】:Android Studio - Same onClick function for multiple viewsAndroid Studio - 多个视图的相同 onClick 功能
【发布时间】:2022-08-18 22:05:44
【问题描述】:

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

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

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

我真的很感激这方面的一些帮助,在此先感谢!

    标签: android android-studio kotlin


    【解决方案1】:

    您可以将单击侦听器设置为多个视图。

    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 在你的视图上设置一个点击监听器,你的活动应该包含一个公共方法 changeTintOnClick 和一个参数 view: View

    // 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" 
        />
    

    【讨论】:

    • 太感谢了!我有“视图:ImageButton”作为我的论点,这就是让我绊倒的原因。另一个小问题:将 id 打印为 view.id 会给出一个长数字,有没有办法获取可视化编辑器中使用的 id?
    • 我添加了那些println 只是强调点击的视图是不同的。无需保留那些 plintln 日志。 android:id="myView" 用于以编程方式获取视图对象,例如 findViewById(R.id.myView)binding.myViewandroid:id 还可以定义其他 xml 元素之间的关系。 android:layout_below="@id/someOtherLayout"。不需要为每个视图设置 android:id。请参阅我更新的答案中的示例。
    【解决方案2】:

    您可以采用的一种方法是在您的主要活动类上放置一个 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 - How to achieve setOnClickListener in Kotlin?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多