如何修复:在 Kotlin 中更改布局时按钮“松动”OnClickListener

Posted

技术标签:

【中文标题】如何修复:在 Kotlin 中更改布局时按钮“松动”OnClickListener【英文标题】:How to fix: Buttons "loose" OnClickListener when changing the layout in Kotlin 【发布时间】:2019-10-30 01:17:46 【问题描述】:

我在 Kotlin 中有两个布局,每个布局都有一个 Button,我只想在两者之间切换。所以我向两者都添加了一个 OnClickListener

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_foward.setOnClickListener(View.OnClickListener 
            setContentView(R.layout.second)
            button_back.setOnClickListener(View.OnClickListener 
                setContentView(R.layout.activity_main)
            )
        )

嗯,它确实有效。我可以转到第二个布局并切换回第一个布局,但我无法再次打开第二个布局!

我想在切换回主视图后我必须重新定义监听器,所以我创建了两个单独的函数来设置视图。

override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        this@MainActivity.createMainScreen()
        )
    

    fun createMainScreen()
        setContentView(R.layout.activity_main)
        button_foward.setOnClickListener(View.OnClickListener 
            this@MainActivity.createSecondScreen()
        )
    
    fun createSecondScreen()
        setContentView(R.layout.second)
        button_back.setOnClickListener(View.OnClickListener 
            this@MainActivity.createMainScreen()
        )
    

当我试图在 Java 中解决同样的问题时,这种方法很有效,但在 Kotlin 中,我仍然只能使用每个 Button 一次。

我该如何解决这个问题?可以(我必须)在重新定义之前重置按钮吗?

或者是否有使用 setContentView 的替代方法?

感谢您的帮助!

【问题讨论】:

从包含的代码来看,很难确定 button_back 设置是否正确。在哪里/何时分配?尝试在使用它的行上设置一个断点,看看它是否是你认为的那样。 【参考方案1】:

我怀疑 button_back 设置不正确。

更简洁的方法可能是使用包含两个备选方案的单一布局,然后在点击处理程序中设置备选方案的可见性。

我真的很喜欢 Anko 而不是 XML 来指定布局,因为它使这些行为更具可读性和独立性。

【讨论】:

【参考方案2】:

好的,

我想,直接赋值给按钮的id就好了

button_foward.setOnClickListener(View.OnClickListener        
                this@MainActivity.createSecondScreen() )

应该得到相同的结果

this.findViewById<Button>(R.id.button_foward).setOnClickListener(View.OnClickListener 
            this@MainActivity.createSecondScreen())

我在某个教程的某处看到了第一个代码示例,并认为这将是 Kotlin 的常用方法。甚至 android Studio 也建议我这样做,但在这种情况下,似乎只有第二种方法可以满足我的要求。

好吧,问题解决了:D 谢谢!

【讨论】:

以上是关于如何修复:在 Kotlin 中更改布局时按钮“松动”OnClickListener的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮后如何切换到另一个 XML 布局?

使用 Kotlin 更改片段中的按钮背景

如何在运行时更改布局?

Kotlin 中布局的可见性

如何在 xml 和 kotlin 组合中创建类似布局的计算器

如何修复滚动视图 android 底部的按钮?