我在某些设备上遇到此问题,并且崩溃分析出现错误。许多用户设备都面临此问题,但在我的设备上工作正常。
无法启动活动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);
答案 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可以具有空的构造函数。