首页 > 解决方案 > 从片段更改活动的按钮状态

问题描述

在这里,我有来自我的活动和片段的代码:

活动:

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)
   }
   ...
}

在这里,我试图更改我的按钮的状态,以便在启动片段时启用。但是,每当我的片段运行时,应用程序就会崩溃并返回到主要活动(应用程序的开始)。为什么试图从我的片段中访问我的活动中的按钮会导致应用程序崩溃。感谢您的宝贵时间,感谢您提供任何帮助。

标签: android-studiokotlinandroid-fragmentsandroid-activityandroid-button

解决方案


您永远不会创建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)  
}

推荐阅读