11

DialogFragment を拡張する Fragment があり、2 つの編集テキストと 2 つのボタン (ok とキャンセル) を含むカスタム レイアウトがあります。私のダイアログは、レイアウトを指定するために onCreateView メソッドを使用して問題なく表示されますが、ボタンのクリックを処理する方法がわかりません。onCreateView メソッド内で、button.setOnClickListener が機能しません。これは簡単な解決策かもしれませんが、私は数時間立ち往生しています。アドバイスやサンプルコードをいただければ幸いです。

PS AlertDialog を使用したくありません。この場合、[OK] ボタンをクリックすると、ダイアログが自動的に閉じてしまい、edittext の検証を行うことができないためです (例: ユーザーが [OK] ボタンを押して、edittext のダイアログが消えないようにしたい)。これが、カスタム ダイアログを作成し、ボタンの動作を簡単に管理するオプションを使用した方法です。

4

6 に答える 6

10

これは私が使用しているダイアログのコードです(ダイアログの実際のGUIはレイアウトリソースconfirm_dialog.xmlで定義されています):

public class ConfirmDialog extends DialogFragment {

    public static String TAG = "Confirm Dialog";

    public interface ConfirmDialogCompliant {
        public void doOkConfirmClick();
        public void doCancelConfirmClick();
    }

    private ConfirmDialogCompliant caller;
    private String message;

    public ConfirmDialog(ConfirmDialogCompliant caller, String message){
        super();
        this.caller = caller;
        this.message = message;
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.confirm_dialog, container, false);
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        ((TextView) view.findViewById(R.id.textview_confirm)).setText(message);
        ((Button) view.findViewById(R.id.ok_confirm_button)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // When button is clicked, call up to owning activity.
                caller.doOkConfirmClick();
            }
        });
        ((Button) view.findViewById(R.id.cancel_confirm_button)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // When button is clicked, call up to owning activity.
                caller.doCancelConfirmClick();
            }
        });
        return view;
    }

}

ダイアログは次の行で作成されます

confirm_dialog = new ConfirmDialog(this, message);
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG);

インターフェイス定義は、呼び出し元(フラグメントまたはアクティビティ)がコントローラーによってスローされたイベントを処理するメソッドを実装することを保証するために使用されます。つまり、このダイアログを呼び出すフラグメントまたはアクティビティは、指定されたインターフェイスを実装する必要があります。
より良い解決策があるかもしれませんが、これは私が理解したものです。それが役に立てば幸い!

于 2012-08-24T15:28:19.960 に答える
8

FragmentDialog クラスのダイアログでキャンセル ボタンのクリックを処理する例を次に示します。

私はandroid.support.v4.app.DialogFragmentを使用しました。

public class MyDialogFragment extends DialogFragment { 
    public MyDialogFragment(){}     
    public static String TAG = "info Dialog";
    Button btn;   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.info_layout, container);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        btn=(Button)view.findViewById(R.id.close_dialog_btn_info_layout);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                getDialog().dismiss();
            }
        });

        return view;
    }





}
于 2014-01-31T08:08:38.213 に答える
7

これらの線に沿って行う

Dialog dl = mDialogFragment.getDialog();
Button btn = dl.findViewById(R.id.btn);
btn.setOnClickListener(this);
于 2012-08-24T15:12:39.830 に答える