如何解决:在Kotlin中更改布局时按钮“松开” OnClickListener

时间:2019-06-15 22:03:05

标签: android button kotlin onclicklistener setcontentview

我在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)
            })
        })

嗯,它实际上正在工作。我可以转到第二个布局并切换回第一个布局,但是我无法再次打开第二个布局!

我认为更改回主视图后必须重新定义Listener,因此我创建了两个单独的函数来设置视图。

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替代方法?

谢谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我怀疑button_back的设置不正确。

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

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

答案 1 :(得分:0)

好吧

我想,直接分配给按钮的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 谢谢!