【问题标题】:calling Fragment constructor caused an exception, kotlin?调用 Fragment 构造函数导致异常,kotlin?
【发布时间】:2020-09-22 09:26:06
【问题描述】:

我正在使用navigationcontroller 导航到另一个片段

导航到第二个片段

private fun moveToNextScreen(userId: String) {
    val bundle = bundleOf("userId" to userId)
    binding.googleLogin.findNavController().navigate(
        R.id.action_loginFragment_to_signupFragment, bundle
    )
}

我正在导航到的片段

class UserSetupFragment : Fragment() {
private lateinit var binding: FragmentUserSetupBinding

var optionCb = mutableListOf<AppCompatCheckBox>()
var optionsList =
    ArrayList<String>(Arrays.asList(*resources.getStringArray(R.array.profile_options)))

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    binding = FragmentUserSetupBinding.inflate(inflater, container, false)
    return binding.getRoot()
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    createOptionsCheckBox()
}

private fun createOptionsCheckBox() {
    for (option in optionsList) {
        val checkBox = AppCompatCheckBox(activity)
        checkBox.setText(option)
        checkBox.setTextColor(ContextCompat.getColor(requireActivity(), android.R.color.black));
        optionCb.add(checkBox)
        binding.optionsLayout.addView(checkBox)
    }
}

}

我遇到了异常

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=66957, result=-1, data=Intent { (has extras) }} to activity {com.patient.reach52/com.patient.reach52.view.authenticate.AuthenticateActivity}: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.patient.reach52.view.authenticate.UserSetupFragment: calling Fragment constructor caused an exception

这里怎么了?

【问题讨论】:

    标签: android kotlin navigation fragment


    【解决方案1】:

    在片段附加到活动之前,您无法访问resources。所以你必须延迟optionsList的实例化

    class UserSetupFragment : Fragment() {
        lateinit var optionsList: List<String>
    
        override fun onAttach(context: Context) {
            super.onAttach(context)
            optionsList = resources.getStringArray(R.array.profile_options).toList()
        }
    ...
    

    【讨论】:

      【解决方案2】:

      您无法从 FragmentClass 访问资源。您应该在 onCreateView 或 onCreate 中定义任何您想要的内容。

      例子:

      class ExampleFragment : Fragment(){
      
           private lateinit var example : String
      
      }
          override fun onCreateView(
          inflater: LayoutInflater, container: ViewGroup?,
          savedInstanceState: Bundle?
      ): View {
          _binding = FragmentExampleBinding.inflate(inflater, container, false)
          val view = binding.root
      
          example = resources.getString(R.string.random)
          
          return view
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多