我有一个这样的课程:
public Class Row {
private int data = 0;
private View.OnClickListener callback = null;
public void setData(int a) { data = a; }
public void setOnClickListener(View.OnClickListener i) { callback = i; }
}
我喜欢将这个类的实例提供给Fragment。考虑到成员接口,我无法对此类进行序列化或包裹,并通过setArgument()
发送。
你有什么建议把这个课提供给我的片段?我想到了3种方法,但我想知道什么更好:
1 - 通过setter函数提供类:
Myfrag frag = new Myfrag();
Row r = new Row();
r.setOnClickListener(this);
frag.setRow(r);
getSupportFragmentManager().beginTrasaction().add(R.id.containder_id, frag).commit();
有些人不鼓励使用此方法,因为似乎此方法可能会在Fragment
娱乐时失败。
2 - 通过回调接口证明课程
在这种情况下,activity提供了一个返回Fragment
的类的接口:
public class MyActivity extend Activity implements Myfrag.OnGetRow{
private Row mRow = null;
...
public createFragment() {
Myfrag frag = new Myfrag();
mRow = new Row();
mRow.setOnClickListener(this);
getSupportFragmentManager().beginTrasaction().add(R.id.containder_id, frag).commit();
}
public Row getRow() {
return mRow;
}
}
在Fragment
:
public class MyFrag extend Fragment {
...
public interface OnGetRow {
public Row getRow();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
OnGetRow mCallback = null;
try {
mCallback = (OnGetRow) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
mRow = mCallback.getRow();
}
}
3 - 只需为活动提供公开功能,并在onAttach()
的{{1}}中进行调用。
你对这个问题有什么建议?
答案 0 :(得分:0)
据我所知,更好的方法是使Row序列化并在bundle中设置Row的实例并将bundle设置为所需Fragment的参数,在重新创建之后,您可以使用函数getArguments()在onResume()方法中获取该bundle。这样你的数据就会持续存在。
答案 1 :(得分:0)
在我看来,最好的方法是,在这个例子中,我使用Dart liblary来减少片段中的代码;
public class MyFragment extends Fragment {
private static final String FIRST_PARAM_KEY = "KEY1";
private static final String SECOND_PARAM_KEY = "KEY2";
@InjectExtra(FIRST_PARAM_KEY)
Integer firstParam;
@InjectExtra(SECOND_PARAM_KEY)
String SecondParam;
public static MyFragment newInstance(Integer param1, String param2) {
Fragment fragment = new MyFragment();
Bundle args = new Bundle();
args.putInt(FIRST_PARAM_KEY, param1);
args.putString(SECOND_PARAM_KEY, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Dart.inject(this, getArguments());
}
}
每当您想要创建新片段时,请使用:Fragment fragment = MyFragment.newInstance(123, "text")
。请记住,如果要传递对象,则该对象必须实现Parcelable
。
答案 2 :(得分:0)
最好的方法是将数据放在bundle中,将setArgument放在片段中。这是一个例子 - 假设我有一个UserModel类的Object传递给UserFragment。
public class UserModel implements Parcelable{
int id;
String name;
String profilePic;
protected UserModel(Parcel in) {
id = in.readInt();
name = in.readString();
profilePic = in.readString();
}
public static final Creator<UserModel> CREATOR = new Creator<UserModel>() {
@Override
public UserModel createFromParcel(Parcel in) {
return new UserModel(in);
}
@Override
public UserModel[] newArray(int size) {
return new UserModel[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
dest.writeString(profilePic);
}
}
现在在UserFragement中这样做:
public class UserFragment extends Fragment {
private UserModel userModel;
private String userStr;
public static Fragment getInstance(UserModel userModel, String userStr) {
Bundle bundle = new Bundle();
bundle.putParcelable("USER_DATA", userModel);
bundle.putString("USER_STR", userStr);
UserFragment userFragment = new UserFragment();
userFragment.setArguments(bundle);
return userFragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getArguments() != null){
Bundle bundle = new Bundle();
userModel = bundle.getParcelable("USER_DATA");
userStr = bundle.getString("USER_STR");
}
}
}
现在使用newInstance方法创建片段的新对象。
希望它会对你有所帮助:)。