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
相关产品推荐
相关产品推荐

