找不到Fragment构造函数

时间:2018-08-13 21:48:55

标签: android android-fragments

我在某些设备上遇到此问题,并且崩溃分析出现错误。许多用户设备都面临此问题,但在我的设备上工作正常。

  

无法启动活动ComponentInfo {com.ox.outloks.new/com.ox.outloks.new.activities.MainDrawerActivity}:android.support.v4.app.Fragment $ InstantiationException:无法实例化com.alchemative片段。 suitters.outfitters.fragments.ProductsFragment:找不到Fragment构造子

错误发生在活动 super.onCreate(savedInstanceState);

awk

这是ProductsFragment构造函数

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

3 个答案:

答案 0 :(得分:10)

您创建的所有Fragment必须必须具有公共的,无参数的构造函数。通常,最佳实践是根本不定义任何构造函数,而依靠Java为您生成默认构造函数。但是您也可以这样写:

public ProductsFragment() {
    // doesn't do anything special
}

如果您的片段需要更多信息,例如在您发布的示例中,String id,通常的模式是定义一个newInstance()静态“工厂方法”,该方法将使用参数Bundle给出将该信息保存到您的片段中。

public static ProductsFragment newInstance(String id) {
    Bundle args = new Bundle();
    args.putString("id", id);
    ProductsFragment f = new ProductsFragment();
    f.setArguments(args);
    return f;
}

现在,您将呼叫new ProductsFragment(id),而不是呼叫ProductsFragment.newInstance(id)。而且,在片段中,您可以通过调用getArguments().getString("id")来访问ID。

通过利用参数捆绑包(而不是创建特殊的构造函数),您的片段将可以被Android框架销毁并重新创建(例如,如果用户旋转手机),并且必要的信息(ID)将持续存在

答案 1 :(得分:2)

到目前为止,接受的答案并不完全正确。使用FragmentFactory

您可以创建片段,例如

MyFragment(arg1:Any, arg2:Any,...) {

} 

并将其实例化到FragmentFactory的实例化方法中

override fun instantiate(classLoader: ClassLoader, className: String): Fragment {

        return when (className) {
            MyFragment::class.java.name -> MyFragment(arg1, arg2)
            
        }

    }

并在Activity的 onCreate 之前将您的FragmentFactory设置为supportFragmentManager的片段工厂,因为Android会检查出空的构造函数片段,如果您在onCreate之前未提供,则您的应用将像往常一样崩溃。 >

supporFragmentManager.fragmentFactory = yourFragmentFactoryInstance

答案 2 :(得分:0)

在Activity和Fragment之间进行通信的一种较新的替代方法是使用ViewModels。这样,允许Fragment可以具有空的构造函数。