实例化时将对象传递给片段或DialogFragment

时间:2013-05-06 19:30:13

标签: android android-fragments fragment android-dialogfragment

我正在尝试找出将对象传递给FragmentDialogFragment而不违反“empty constructor”规则的正确方法。

例如,我创建了一个自定义视图,并为每个实例化我想要关联DiaglogFragment。此DialogFragment将用于显示控件,用户可以使用该控件更改与其关联的自定义View的某些方面。因为View是一个对象我理解我不能使用setArguments()

我可以实现我的DialogFragment的newInstance(View)方法,即Factory模式,但是如果我的Fragment被系统保存然后在以后恢复会发生什么?据我所知,没有对View对象的引用?

有人可以告诉我,我是否以错误的方式使用碎片,或者是否有办法将对象传递给碎片,这也将在稍后的时间处理系统重建。

4 个答案:

答案 0 :(得分:13)

DialogFragmnet课程中,您可以创建两种方法:

  1. newInstance制作DialogFragment

  2. 的实例
  3. 设置初始化对象

  4. 并在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();
}

你必须在你的活动中为那个

创建一个Getter
public 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());

    }