android - 找不到片段构造函数
问题描述
我在某些设备上遇到了这个问题,并且在我的崩溃分析中遇到了错误。很多用户设备都面临这个问题,但在我的设备上它工作正常。
无法启动活动 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;
}
解决方案
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)将保持不变。
推荐阅读
- javascript - 在 JavaScript 中嵌套数组函数时需要帮助
- javascript - “While”阻塞异步操作
- c++ - 如何将文本文件中的数据列表与数组进行比较?
- mysql - 如何选择空格之前的字符串值的一部分
- javascript - 使用方法“POST”的 JavaScript Fetch 被调用两次
- dictionary - 在 Ansible 中动态生成复杂的数据结构
- go - 推荐的 getter 和 setter 方法
- javascript - 我应该将 javaScript 函数放在节点的哪里?
- angular - 在带有导入的 css 库的 Angular styles.scss @extend 元素中?
- python - ttk.Notebook() 选项卡居中的问题