Android 找不到片段构造函数

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:找不到片段构

我在一些设备上遇到了这个问题,并且在崩溃分析中出错。很多用户设备都面临这个问题,但在我的设备上,它工作正常

无法启动活动组件信息{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实例中。我发现这是一个更简单的方法!向上投票!