android-studio - 从片段更改活动的按钮状态
问题描述
在这里,我有来自我的活动和片段的代码:
活动:
class Activity0: AppCompatActivity() {
private lateinit var binding: Activity0Binding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = Activity0Binding.inflate(layoutInflater)
setContentView(binding.root)
binding.popUpButton.setOnClickListener {
supportFragmentManager.commit {
replace(R.id.quiz_fragment_container, Activity0FragmentNull())
}
binding.popUpButton.isEnabled = false
}
}
}
分段:
class Activity0FragmentNull : Fragment() {
...
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Activity0().popUpButton.isEnabled = true
return inflater.inflate(R.layout.activity0_null, container, false)
}
...
}
在这里,我试图更改我的按钮的状态,以便在启动片段时启用。但是,每当我的片段运行时,应用程序就会崩溃并返回到主要活动(应用程序的开始)。为什么试图从我的片段中访问我的活动中的按钮会导致应用程序崩溃。感谢您的宝贵时间,感谢您提供任何帮助。
解决方案
您永远不会创建Activity
对象,这是操作系统的责任。所以永远不要这样做Activity0()
。在片段中,您可以使用activity
属性访问关联的 Activity。
至于你的问题,它可以解决为
定义一个接口
interface ButtonStateManager{
fun setEnabled(enabled: Boolean)
}
让你的 Activity 实现这个接口
class Activity0: AppCompatActivity(), ButtonStateManager {
...
override fun setEnabled(enabled: Boolean) {
binding.popUpButton.isEnabled = enabled
}
}
Fragment
现在您可以启用/禁用按钮
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
/* cast the activity to ButtonStateManager and then call the function */
(activity as? ButtonStateManager)?.setEnabled(true)
}
推荐阅读
- javascript - Eclipse 2020 Javascript 编辑器默认不工作
- angular - Angular 10/Ionic 5 - 将输入数据从模态传递到父组件
- regex - 正则表达式获取两个识别文本块之间的文本
- javascript - 在 Mapbox GL JS 中添加 WMS v 1.3.0
- php - 我想在 WPBakery 元素简码中更改 ::before 伪元素的样式
- angular - Autodesk forge 查看器文档加载失败
- java - 模块的运行时访问
- css - 如何防止我的引导警报在显示时阻止我的导航中的项目?
- io - 如何加快 PyPy3 中的文件 I/O?
- discord.js - 不和谐没有在嵌入上打印自定义表情符号?