You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin导航抽屉切换Fragment后Home页控件失效及状态保存求助

问题根源

你把Home Fragment专属的控件逻辑写在了MainActivity的onCreate生命周期中,导致切换Fragment后事件失效:

  • MainActivity的onCreate仅在Activity首次创建时执行1次,此时你绑定点击事件的是首次加载的Home Fragment视图上的控件
  • 切换到其他Fragment后,Home Fragment的旧视图会被系统销毁
  • 再次切回Home Fragment时,系统会创建全新的Home视图,新视图上的按钮、输入框没有绑定任何事件,因此完全无响应
解决方案

Fragment的专属业务逻辑必须放在对应Fragment的类中实现,不要写在Activity里,修改步骤如下:

步骤1:删除MainActivity中的无效代码

把MainActivity.kt里从val inputcatload2 = findViewById(...)到btn2.setOnClickListener{...}之间的所有代码全部删除,这部分逻辑全部移到HomeFragment中。

步骤2:在HomeFragment.kt中实现业务逻辑

找到Android Studio自动生成的HomeFragment.kt(默认路径是java/你的包名/ui/home/HomeFragment.kt),替换为以下代码:

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.你的包名.R // 注意替换成你自己项目的包名

class HomeFragment : Fragment() {
    // 声明控件变量
    private lateinit var inputcatload2: EditText
    private lateinit var inputcatconv2: EditText
    private lateinit var inputcfr2: EditText
    private lateinit var outputcatflow2: TextView
    private lateinit var outputdistillateflow2: TextView
    private lateinit var outputtotalfeed2: TextView
    private lateinit var outputh1passessv2: TextView
    private lateinit var msg1: TextView
    private lateinit var btn1: Button
    private lateinit var btn2: Button

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // 加载Home Fragment的布局
        val root = inflater.inflate(R.layout.fragment_home, container, false)
        // 从当前加载的Fragment视图中查找控件
        inputcatload2 = root.findViewById(R.id.inputcatload1)
        inputcatconv2 = root.findViewById(R.id.inputcatconv1)
        inputcfr2 = root.findViewById(R.id.inputcfr1)
        outputcatflow2 = root.findViewById(R.id.outputcatflow1)
        outputdistillateflow2 = root.findViewById(R.id.outputdistillateflow1)
        outputtotalfeed2 = root.findViewById(R.id.outputtotalfeed1)
        outputh1passessv2 = root.findViewById(R.id.outputh1passessv1)
        msg1 = root.findViewById(R.id.message1)
        btn1 = root.findViewById(R.id.button1)
        btn2 = root.findViewById(R.id.button2)

        // 计算按钮点击事件
        btn1.setOnClickListener {
            when {
                inputcatload2.text.isEmpty() || inputcatload2.text.toString() == "." -> {
                    msg1.text = "Please input correct Load"
                }
                inputcatconv2.text.isEmpty() || inputcatconv2.text.toString() == "." -> {
                    msg1.text = "Please input correct Cat. Conversion"
                }
                inputcfr2.text.isEmpty() || inputcfr2.text.toString() == "." -> {
                    msg1.text = "Please input correct CFR"
                }
                else -> {
                    msg1.text = "*** RESULTS ***"
                    val val1 = inputcatload2.text.toString().toFloat()
                    val val2 = inputcatconv2.text.toString().toFloat()
                    val val3 = inputcfr2.text.toString().toFloat()

                    val result1 = val1 * 148.72 / 100
                    outputcatflow2.text = String.format("%.2f", result1)

                    val result2 = val1 * 148.72/100 * val3
                    outputtotalfeed2.text = String.format("%.1f", result2)

                    val result3 = result2 - result1
                    outputdistillateflow2.text = String.format("%.2f", result3)

                    val result4 = result2 / 2
                    outputh1passessv2.text = String.format("%.1f", result4)
                }
            }
        }

        // 重置按钮点击事件
        btn2.setOnClickListener {
            inputcatload2.setText("100")
            inputcatconv2.setText("31.2")
            inputcfr2.setText("1.24")
            msg1.text = ""
            outputcatflow2.text = ""
            outputdistillateflow2.text = ""
            outputtotalfeed2.text = ""
            outputh1passessv2.text = ""
        }

        return root
    }
}

步骤3:验证修改

替换完成后修改代码中的包名为你自己项目的包名,重新运行项目即可,切换Fragment后返回Home,控件即可正常响应操作。

内容的提问来源于stack exchange,提问作者Umair Fareed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:54:03