我正在尝试找出将对象传递给Fragment或DialogFragment而不违反“empty constructor”规则的正确方法。
例如,我创建了一个自定义视图,并为每个实例化我想要关联DiaglogFragment。此DialogFragment将用于显示控件,用户可以使用该控件更改与其关联的自定义View的某些方面。因为View是一个对象我理解我不能使用setArguments()。
我可以实现我的DialogFragment的newInstance(View)方法,即Factory模式,但是如果我的Fragment被系统保存然后在以后恢复会发生什么?据我所知,没有对View对象的引用?
有人可以告诉我,我是否以错误的方式使用碎片,或者是否有办法将对象传递给碎片,这也将在稍后的时间处理系统重建。
答案 0 :(得分:13)
在DialogFragmnet
课程中,您可以创建两种方法:
newInstance
制作DialogFragment
设置初始化对象
并在setRetainInstance(true);
onCreate
public class YourDialogFragment extends DialogFragment {
ComplexVariable complexVar;
public static YourDialogFragment newInstance(int arg, ComplexVariable complexVar) {
YourDialogFragment frag = new MoveSongDialogFragment();
Bundle args = new Bundle();
args.putInt("count", arg);
frag.setArguments(args);
frag.setComplexVariable(complexVar);
return frag;
}
public void setComplexVariable(ComplexVariable complexVar) {
this.complexVar = complexVar;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
}
然后,显示对话框
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
Fragment prev = manager.findFragmentByTag("yourTag");
if (prev != null) {
ft.remove(prev);
}
// Create and show the dialog.
DialogFragment newFragment = YourFragmentDialog.newInstance(argument, yourComplexObject);
newFragment.show(ft, "yourTag");
答案 1 :(得分:2)
您可以将Bundle extras中的Object作为Parcelable Objects(http://developer.android.com/reference/android/os/Parcelable.html)传递,并将它们传递给onCreateView(Bundle savedInstanceState)
中的Bundle。您可以在用户翻转屏幕时保存它们。
编辑: this Parcelable教程相当不错!
另一种方法是从ParentActivity获取数据对象,但我不确定这是否是一种好方法(但它有效..)
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mYourObject = ((MainActivity) getActivity()).getYourObject();
}
你必须在你的活动中为那个
创建一个Getterpublic YourObject getYourObject(){
return mYourObecjt;
}
但我猜Parcelables是更好的方法,因为你可以重复使用你的片段而没有任何依赖...
答案 2 :(得分:0)
您总是可以使用一个很好的 JSON 库(如GSON或 Genson )来序列化对象 - 这是我对任何远程复杂对象的goto方法。对于简单的操作,GSON稍微紧凑,但如果你的视图中有任何类型的继承/多态,我强烈推荐Genson。只要你记录它们就可以有一个带参数的ctr。
https://code.google.com/p/genson/ - 在下载部分获取JAR。
答案 3 :(得分:0)
我通过共享偏好修复了我的需求。 YuzdeDataUser是我的自定义clas,我从My Listview中获取它onClickItemListener
如何发送
YuzdeDataUser clickedObj = (YuzdeDataUser) parent.getItemAtPosition(position);
//clickedObj.setTarihim();
SharedPreferences shp = getSharedPreferences("sam", MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
Gson gson = new Gson();
String json = gson.toJson(clickedObj);
editor.putString("yoklamaList", json);
editor.commit();
FragmentManager fragmentManager = getSupportFragmentManager();
AylikRaporPop userPopUp = new AylikRaporPop();
userPopUp.show(fragmentManager, "sam");
如何接收
SharedPreferences shp = parent.getSharedPreferences("sam", MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
Gson gson = new Gson();
String json = shp.getString("yoklamaList", "");
YuzdeDataUser user = gson.fromJson(json, YuzdeDataUser.class);
if (user != null) {
txt_ad.setText(user.getAd());
txt_tur_tarih.setText(Util.getInstance(parent).writeNameOfTur(user.getTur_id()));
txt_var.setText("" + user.getVar());
txt_gorevli.setText("" + user.getGorevli());
txt_yok.setText("" + user.getYok());
}