我正在使用导航体系结构组件库,我的应用程序的起点是以下片段:

class MainFragment : BaseFragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_main, container, false)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

它从一个抽象类BaseFragment继承:
abstract class BaseFragment : Fragment() {

}

当我运行我的应用程序时,我得到:
 Unable to instantiate fragment io.example.MainFragment: calling Fragment constructor caused an exception

但是,如果MainFragment扩展了Fragment而不是BaseFragment,则不会发生这种情况。是什么原因?这与导航体系结构组件的工作方式有关吗?

最佳答案

我遇到了类似的问题,因为在 MyBaseFragment 中有val

protected abstract val gpsMsg: String

在片段附加到上下文之前,我在其他片段中以这种方式覆盖了该片段。
override val gpsMsg: String = getString(R.string.gps_not_enabled)

因此,潜在的错误是因为context为null,并且getString使用getResources()返回requireContext().getResources()。并且在requireContext()源代码中将引发错误。
public final Context requireContext() {
    Context context = getContext();
    if (context == null) {
        throw new IllegalStateException("Fragment " + this + " not attached to a context.");
    }
    return context;
}

因此抛出的错误导致片段无法实例化。因此,我建议覆盖时要谨慎处理上下文。

关于android - 调用Fragment构造函数导致异常。导航架构组件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54050648/

10-11 20:10