8

カスタムレイアウト(EditTextのみ)のAlertDialogがあり、[OK]ボタンがクリックされたときにデータを検証したいと思います。検証が失敗した場合、ダイアログを閉じたくありません。

ダイアログのデフォルトボタン(ポジティブとネガティブ)を使用しています。"setPositiveButton(" "、new DialogInterface.OnClickListener()..."を使用すると、ダイアログは常に閉じられます。いくつかの投稿を見て、onClick Listenerをオーバーライドする必要があると言われましたが、機能させることができません。 。これは私が見つけたコードです:

Button theButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
theButton.setOnClickListener(new CustomListener(dialog));

ダイアログを表示した後に実行する必要があると表示されているため、このコードをDialogFragment内ではなくアクティビティ内に配置しましたが、mDialogFragment.getDialog()を使用すると、常にnullが返されます。

これは私のダイアログフラグメントの一部です:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    builder.setTitle(R.string.new);

    LayoutInflater inflater = getActivity().getLayoutInflater();
    dialogView = inflater.inflate(R.layout.edit_license, null);

    builder.setView(dialogView)

    // Add action buttons
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {

        }
    })
    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            MyDialogFragment.this.getDialog().cancel();
        }
    }); 

    return builder.create();

}

そして、私のアクティビティでは、次のことを行います。

DialogFragment dialog = new MyDialogFragment(true, null);
dialog.show(getSupportFragmentManager(), "EditLicenseDialogFragment");

AlertDialog alertDialog = (AlertDialog)dialog.getDialog();
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
btnPositive.setOnClickListener(new CustomListener(alertDialog));

... 

class CustomListener implements View.OnClickListener {
    private final Dialog dialog;
    public CustomListener(Dialog dialog) {
        this.dialog = dialog;
    }
    @Override
    public void onClick(View v) {
        ...
    }
}

私が言ったように、(AlertDialog)dialog.getDialog(); 常にnullを返します。何故ですか?検証に問題がある場合、どうすればダイアログを閉じないようにできますか?

ありがとう!

4

2 に答える 2

6

この解決策は私のために働きます。ダイアログはonResumeにすでに表示されているため、ボタンにアクセスしてリスナーを置き換えるのに適した場所です。

public class XYZFragment extends DialogFragment {
   ...

    @Override
    public void onResume() {
        super.onResume();

        AlertDialog dialog = (AlertDialog)getDialog();

        Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
        positiveButton.setOnClickListener(new View.OnClickListener() {                  
            @Override
            public void onClick(View onClick) {
            ...
            }
        });
    }
}
于 2013-04-08T19:14:49.080 に答える
3

これがDialogFragmentのリファレンスからのテキストです:

アクティビティのウィンドウの上に浮かぶダイアログウィンドウを表示するフラグメント。このフラグメントにはDialogオブジェクトが含まれており、フラグメントの状態に基づいて適切に表示されます。ダイアログの制御(表示、非表示、非表示のタイミングの決定)は、ダイアログを直接呼び出すのではなく、ここでAPIを介して行う必要があります。

getDialog()。dismiss()を呼び出す代わりに、 dismiss()を実行する必要があります

于 2013-02-12T11:02:04.420 に答える