【问题标题】:How to fix: Buttons "loose" OnClickListener when changing the layout in Kotlin如何修复:在 Kotlin 中更改布局时按钮“松动”OnClickListener
【发布时间】: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 设置是否正确。在哪里/何时分配?尝试在使用它的行上设置一个断点,看看它是否是你认为的那样。

标签: android button kotlin onclicklistener setcontentview


【解决方案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 谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2011-09-01
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多