15

「空のコンストラクター」ルールを破ることなく、オブジェクトをFragmentまたはDialogFragmentに渡す正しい方法を見つけようとしています。

たとえば、カスタム ビューを作成し、インスタンス化するビューごとに DiaglogFragment を関連付けたいとします。この DialogFragment は、関連付けられているカスタム ビューの特定の側面をユーザーが変更できるコントロールを表示するために使用されます。View は Object であるため、 setArguments()を使用できないことを理解しています。

DialogFragment の newInstance(View) メソッド、つまり Factory パターンを実装できますが、Fragment がシステムによって保存され、後日復元されるとどうなりますか? 私が知る限り、View オブジェクトへの参照はありませんか?

フラグメントを間違った方法で使用しているかどうか、またはオブジェクトを後で再構築するシステムにも対処するフラグメントにオブジェクトを渡す方法があるかどうかを誰かに教えてもらえますか。

4

4 に答える 4

16

DialogFragmnetクラスで、次の 2 つのメソッドを作成します。

  1. newInstanceあなたのインスタンスを作成するDialogFragment

  2. オブジェクトを初期化するセッター

追加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");
于 2014-05-02T19:50:30.560 に答える
3

バンドル エクストラのオブジェクトを Parcelable オブジェクト ( http://developer.android.com/reference/android/os/Parcelable.html ) として渡し、onCreateView(Bundle savedInstanceState). ユーザーが画面を反転した場合でも、それらを保存できます。

編集: このParcelable チュートリアルはとても良かったです!

別の方法は、ParentActivity からデータ オブジェクトを取得することですが、これが良い方法かどうかはわかりません (しかし、うまくいきます..)

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mYourObject = ((MainActivity) getActivity()).getYourObject();
}

そのためには、アクティビティでゲッターを作成する必要があります

public YourObject getYourObject(){
   return mYourObecjt;
}

しかし、依存関係なしでフラグメントを再利用できるため、Parcelables の方が良い方法だと思います...

于 2013-05-06T19:43:20.853 に答える
0

オブジェクトをシリアル化するために、GSON やGensonなどの優れたJSONライブラリをいつでも使用できます。これは、リモートで複雑なオブジェクトに対する私の goto アプローチです。GSON は、単純な操作にはもう少しコンパクトですが、ビューに何らかの継承/ポリモーフィズムがある場合は、Genson を強くお勧めします。それらを文書化する限り、引数付きの ctr を持つことができます。

https://code.google.com/p/genson/ - ダウンロード セクションで JAR を取得します。

于 2013-05-07T12:38:22.660 に答える
0

sharepreference で必要性を修正しました。YuzdeDataUser は、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());

    }
于 2017-07-12T09:13:56.930 に答える