Android 找不到片段构造函数
我在一些设备上遇到了这个问题,并且在崩溃分析中出错。很多用户设备都面临这个问题,但在我的设备上,它工作正常 无法启动活动组件信息{com.ox.outloks.new/com.ox.outloks.new.activities.MainDrawerActivity}:android.support.v4.app.Fragment$实例化异常:无法实例化片段com.alchemative.outfitters.outfitters.fragments.ProductsFragment:找不到片段构造函数Android 找不到片段构造函数,android,android-fragments,Android,Android Fragments,我在一些设备上遇到了这个问题,并且在崩溃分析中出错。很多用户设备都面临这个问题,但在我的设备上,它工作正常 无法启动活动组件信息{com.ox.outloks.new/com.ox.outloks.new.activities.MainDrawerActivity}:android.support.v4.app.Fragment$实例化异常:无法实例化片段com.alchemative.outfitters.outfitters.fragments.ProductsFragment:找不到片段构
@SuppressLint("ValidFragment")
public ProductsFragment(String id) {
categoryID = id;
}
错误出现在activitysuper.onCreate(savedInstanceState)中的行上强>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
下面是ProductsFragment构造函数
@SuppressLint("ValidFragment")
public ProductsFragment(String id) {
categoryID = id;
}
您创建的所有
Fragment
类必须有一个公共的、无参数的构造函数。一般来说,最佳实践是根本不定义任何构造函数,而是依靠Java为您生成默认构造函数。但你也可以这样写:
public ProductsFragment() {
// doesn't do anything special
}
如果您的片段需要额外的信息,如您发布的示例中的stringid
,一个常见的模式是定义一个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;
}
现在,您将调用ProductsFragment.newInstance(id)
,而不是调用newproductsFragment.newInstance(id)
。并且,在片段内部,您可以通过调用getArguments().getString(“id”)
来访问id
通过利用arguments bundle(而不是创建特殊的构造函数),您的片段将能够被Android框架销毁和重新创建(例如,如果用户旋转手机),并且您所需的信息(id)将保持不变。一种新的活动和片段之间通信的替代方案,因此,允许片段可以有一个空的构造函数将是一种使用。接受的答案在今天并不完全正确。与 您可以创建片段,例如
MyFragment(arg1:Any, arg2:Any,...) {
}
并在FragmentFactory的实例化方法中实例化它
override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
return when (className) {
MyFragment::class.java.name -> MyFragment(arg1, arg2)
}
}
并在活动的onCreate之前将您的FragmentFactory设置为supportFragmentManager的片段工厂,因为Android会检查空的构造函数片段,如果您在onCreate之前不提供,您的应用程序将像往常一样崩溃
supporFragmentManager.fragmentFactory = yourFragmentFactoryInstance
您的
ProductsFragment
类看起来像什么?你有什么特殊的构造器吗?@BenP。我已经更新了我的问题,是的,我有特别的问题constructor@BenP. 比我快。另一方面,确保您有一个默认的空构造函数(不要覆盖默认构造函数),片段需要一个。另外,您应该在该片段中定义一个静态方法(newInstance),该方法使用参数……”“不要保留活动”开发人员设置有助于复制这个问题:这是一个很棒的答案,我正在应用它,我将更新您。谢谢,我已经完成了,但是仍然收到了错误-问题:java.lang.RuntimeException:无法启动活动组件信息{com.blipclap.wallper/com.blipclap.wallper.HomeActivity}:androidx.fragment.app.fragment$InstantiationException:无法实例化fragment com.blipclap.wallp.fragment.RecentsFragment:找不到片段构造函数如果需要将对象变量(可能是FrameLayout)作为额外信息传递,该怎么办?因为我看不到任何方法可以把它放到Bundle实例中。我发现这是一个更简单的方法!向上投票!