【问题标题】:How can I code buttons to change layouts in Kotlin?如何编写按钮以更改 Kotlin 中的布局?
【发布时间】:2020-07-10 04:34:25
【问题描述】:

我正在尝试为 Android 制作一个基于文本的选择游戏,非常类似于名为“Magium”的游戏

https://play.google.com/store/apps/details?id=com.magiumgames.magium&hl=en

用户将通过按下相应的按钮从几个选项中进行选择以推进故事。按下按钮后,我希望应用程序显示另一个布局。假设 page1 中只有一个按钮(名为 button1)。按下它会将布局更改为 page2。我通过以下方式实现了这一目标:

button1.setOnClickListener {
setContentView(R.layout.page2)
}

再次,为简单起见,假设 page2 中只有一个按钮(名为 button2)。我想在用户按下 button2 后显示 page3。

我在之前的代码下面添加了相同的代码:

button1.setOnClickListener {
setContentView(R.layout.page2)
}

button2.setOnClickListener {
setContentView(R.layout.page3)
}

但是,当我执行此操作时,应用程序无法打开。我刚开始学习编程。有人能指出我正确的方向吗?

【问题讨论】:

标签: android kotlin


【解决方案1】:

在大多数情况下,您不应该多次调用 setContentView()。您可以在answer 中阅读更多内容。

是否有必要将整个布局更改为仅更新其内容?当用户单击时,您应该更新 UI 的内容,而不是膨胀另一个布局。

【讨论】:

  • 我已经检查了您共享的链接,“viewFlipper”可能正是我需要的。我会了解的。谢谢!
【解决方案2】:

您是否检查过是否调用了第二个按钮的 clickListener? 如果您在调用setContentView(R.layout.page2) 之前设置了点击侦听器,则可能不会显示按钮供您注册。

但我同意alvarezfmb,您应该使用更好的解决方案来更改视图,也许Fragments 甚至隐藏和显示视图都比这个解决方案更好。

【讨论】:

    【解决方案3】:

    你可以使用片段。

    首先,在您的活动布局中使用 Fragment 的容器,这里我们给它一个 id,如 android:id="+id/fragment_container"

    其次,为你的fragment创建一个布局xml文件,这里我们给它起个名字,比如fragment_page_3.xml

    然后创建一个 Fragment 的子类,并覆盖它的 onCreateView() 方法,您可以在其中扩展 Fragment 的布局。代码在这里

        class Page3Fragment : Fragment() {
    
        override fun onCreateView(
                inflater: LayoutInflater,
                container: ViewGroup?,
                savedInstanceState: Bundle?
        ): View {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_page_3, container, false)
        }
    }
    

    最后,在 clickListener 中,你可以使用 fragmentManager 加载你的片段,代码如下:

    button2.setOnClickListener {
        val fragment = Page3Fragment()
        val fm = supportFragmentManager
        fm.beginTransaction()
                .add(R.id.fragment_container,fragment)
                .commit()
    } 
    

    我只是想给你一些想法。

    您不能编写这样的代码,这对您的应用来说是错误的实现,因为您可能需要多个片段并且您需要一个由您的活动实现的回调接口。

    如果你可以改变你的 UI 内容,这是一个更好的方法。

    想了解更多,可以参考https://developer.android.com/guide/components/fragments

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多