首页 > 解决方案 > 找不到片段构造函数

问题描述

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

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

错误出现在活动super.onCreate(savedInstanceState);

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

这是 ProductsFragment 构造函数

    @SuppressLint("ValidFragment")
public ProductsFragment(String id) {
    categoryID = id;
}

标签: androidandroid-fragments

解决方案


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").

通过利用参数包(而不是创建一个特殊的构造函数),您的片段将能够被 Android 框架销毁和重新创建(例如,如果用户旋转他们的手机)并且您的必要信息(id)将保持不变。


推荐阅读