目前我没有太多关于片段的经历,所以我希望任何人都可以帮助我!在应用程序发布之前一个月前编译好了,现在我遇到了这个问题
Android Studio说: “问题避免在片段中没有默认构造函数。”
我希望有人可以帮我解决这个问题。
public static class TagClickDialog extends DialogFragment {
private final TagClickDialogListener mListener;
private final Context mContext;
private final Tag[] mTags;
public TagClickDialog(Context context, TagClickDialogListener listener, Tag[] tags) {
mListener = listener;
mContext = context;
mTags = tags;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String[] dialogItems = new String[mTags.length];
for (int i=0; i<mTags.length; i++) {
dialogItems[i] = mTags[i].getValue();
}
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(getResources().getString(R.string.tags))
.setItems(dialogItems, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
mListener.onTagClick(mTags[which]);
}
});
return builder.create();
}
}
答案 0 :(得分:0)
每个片段都必须有一个空的构造函数,所以它可以 在恢复其活动状态时实例化。这是强烈的 建议子类没有其他构造函数 参数,因为这些构造函数不会被调用 片段被重新实例化;相反,参数可以由。提供 调用者使用setArguments(Bundle),然后由Fragment检索 使用getArguments()。
由于这个原因,当我们需要该片段newInstance()
的实例时,我们有静态工厂方法,以防您希望它实例化一些信息。
<强>更新强> 你可以使用以下代码
public static class TagClickDialog extends DialogFragment {
private TagClickDialogListener mListener;
private Context mContext;
private Tag[] mTags;
public TagClickDialog() {
}
**update**
@Override
public void onAttach(Context context) {
super.onAttach(context);
mListener = (TagClickDialogListener )context;
}
public static TagClickDialog newInstance(Context context, Tag[] tags) {
mContext = context;
mTags = tags;
return this;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String[] dialogItems = new String[mTags.length];
for (int i=0; i<mTags.length; i++) {
dialogItems[i] = mTags[i].getValue();
}
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(getResources().getString(R.string.tags))
.setItems(dialogItems, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
mListener.onTagClick(mTags[which]);
}
});
return builder.create();
}
}
}
这就是你如何使用它
TagClickDialog fragment = TagClickDialog.newInstance("put all the parameters");
fragment.show(fragmentManager, "some tag");
答案 1 :(得分:0)
从活动中,您可以将数据发送到Fragment,意图为:
Bundle bundle = new Bundle();
bundle.putString("message", "message is hi");
//set Fragmentclass Arguments
Fragmentclass fragobj=new Fragmentclass();
fragobj.setArguments(bundle);
并在片段onCreateView方法中接收片段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// get message from activity
String strtext=getArguments().getString("message");
return inflater.inflate(R.layout.fragment, container, false);
}
这对我来说很好。这可能会对你有帮助。
答案 2 :(得分:0)
如果要为片段创建非默认构造函数,则会出现此错误
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead.
当然这意味着您必须删除非默认构造函数。
我通常做的事情
<强> 1。使用Bundle传递数据 [除非它是一个Object,在这种情况下你必须序列化它]和一个键,这样在Fragment中你可以通过键获得Bundle
Bundle args = new Bundle();
args.putLong("key", value);
fragment.setArguments(args);
在Fragment中,您将参数检索为
getArguments().getType("key");
<强> 2。但有时我会在Fragment中创建一个setter方法来设置数据。
public void setData(int value) {
this.value = value;
}
当我初始化片段时,我立即调用此方法。
MyFragment fragment = new MyFragment();
fragment.setData(5);