22

listItemClickにDialogFragment(Yes / No)を表示したいlistFragmentがあります。listFragmentでユーザー選択(はい/いいえ)を取り戻したい。リスナーインターフェイスメカニズムについて読みましたが、アクティビティ<->フラグメントで機能します。これを行う1つの方法は次のとおりです。

  1. はい/いいえボタン選択関数を含むダイアログフラグメントでインターフェイスを定義し、アラートダイアログのポジティブ/ネガティブボタンクリックでこれらのメソッドを呼び出します。
  2. このインターフェースをメインアクティビティに実装します。
  3. listFragmentonItemクリックでdialogFragmentを開始します。
  4. ユーザーの選択をアクティビティに保存します。
  5. Mainアクティビティで実装された別のインターフェイスによってlistFragmentでこの選択を取得します。

しかし、この単純なタスクのための単純なメカニズムはありますか?例やコードはありますか?

4

2 に答える 2

75

DialogFragmentから結果を取り戻す別の方法があります。

Fragment.setTargetFragment()を使用できます。DialogFragmentのインスタンスを作成するときは、それにターゲットフラグメントを設定します。次に、DialogFragmentで、 Fragment.getTargetFragment()からこのフラグメントを取得できます。

たとえば、次のように実行できます。

public interface DialogClickListener {
    public void onYesClick();
    public void onNoClick();
}
public class MyListFragment extends ListFragment implements DialogClickListener {

    ...

    private void showDialog() {
        DialogFragment dialog = new MyDialogFragment();
        dialog.setTargetFragment(this, 0);
        dialog.show(getFragmentManager(), "dialog");
    }

    @Override
    public void onYesClick() {
        // do something
    }

    @Override
    public void onNoClick() {
        // do something
    }
}
public class MyDialogFragment extends DialogFragment {
    private DialogClickListener callback;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            callback = (DialogClickListener) getTargetFragment();
        } catch (ClassCastException e) {
            throw new ClassCastException("Calling fragment must implement DialogClickListener interface");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("message")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        callback.onYesClick();
                    }
                }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        callback.onNoClick();
                    }
                });

        return builder.create();
    }
}
于 2013-01-01T12:23:05.973 に答える
2

イベントバスを使用して、コンポーネント間の通信を容易にすることもできます。Ottoは、ここで利用できる優れたライブラリです-> https://github.com/square/otto。それはSquareの人たちによって作られているので、質の高いオープンソースプロジェクトを知っています。

リポジトリには、使い方がいかに簡単かを示すサンプルがあります。

于 2012-11-06T06:33:13.667 に答える