如何确保片段是在 activity 中从静态方法 new Instance 创建的
How to make sure that fragment is created in the activity from static method new Instance
我正在设计一个供其他开发人员使用的片段。
片段必须具有 android SDK 在创建片段时使用的 public 构造函数,但要将数据从 activity 传递到片段,最好创建一个在片段中创建片段的静态方法class 像这样
public static FaceMatchingResultFragment newInstance(boolean matched, String param2) {
FaceMatchingResultFragment fragment = new FaceMatchingResultFragment();
Bundle args = new Bundle();
args.putBoolean(ARG_PARAM1, matched);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
我的问题是有没有办法确保开发人员必须使用此方法而不是 public 构造函数?
在 onCreate
期间检查参数包是否包含在内是最干净的方法,不会乱用反射。如果你想在访问无参数构造函数时显示内联错误,你可以使用 RestrictTo
annotation:
public class SimpleArgFragment extends Fragment {
public static SimpleArgFragment newInstance(boolean val) {
Bundle args = new Bundle();
args.putBoolean("param", val);
SimpleArgFragment f = new SimpleArgFragment();
f.setArguments(args);
return f;
}
@androidx.annotation.RestrictTo({RestrictTo.Scope.SUBCLASSES})
public SimpleArgFragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() == null)
throw new IllegalArgumentException("Missing arguments - use newInstance() to create.");
}
}
我正在设计一个供其他开发人员使用的片段。 片段必须具有 android SDK 在创建片段时使用的 public 构造函数,但要将数据从 activity 传递到片段,最好创建一个在片段中创建片段的静态方法class 像这样
public static FaceMatchingResultFragment newInstance(boolean matched, String param2) {
FaceMatchingResultFragment fragment = new FaceMatchingResultFragment();
Bundle args = new Bundle();
args.putBoolean(ARG_PARAM1, matched);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
我的问题是有没有办法确保开发人员必须使用此方法而不是 public 构造函数?
在 onCreate
期间检查参数包是否包含在内是最干净的方法,不会乱用反射。如果你想在访问无参数构造函数时显示内联错误,你可以使用 RestrictTo
annotation:
public class SimpleArgFragment extends Fragment {
public static SimpleArgFragment newInstance(boolean val) {
Bundle args = new Bundle();
args.putBoolean("param", val);
SimpleArgFragment f = new SimpleArgFragment();
f.setArguments(args);
return f;
}
@androidx.annotation.RestrictTo({RestrictTo.Scope.SUBCLASSES})
public SimpleArgFragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() == null)
throw new IllegalArgumentException("Missing arguments - use newInstance() to create.");
}
}