さまざまな状況で異なるアクティビティで一般的に使用できるカスタムダイアログクラスをいくつか作成したいと決めました。最新のAndroid SDKで提案されているように、私はこの使用してDialogFragmentsをやっていることも汎用ダイアログクラスからデータを取り出す方法
public class EditTextDialogFragment extends DialogFragment {
// Factory method to create a new EditTextDialogFragment
public static EditTextDialogFragment newInstance(int title, int defaultText) {
EditTextDialogFragment frag = new EditTextDialogFragment();
Bundle args = new Bundle();
args.putInt("title", title);
args.putInt("defaultText", defaultText);
frag.setArguments(args);
return frag;
}
// Set title and default text
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Set an EditText view to get user input
EditText inputView = new EditText(getActivity());
inputView.setHint(getArguments().getInt("defaultText"));
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(getArguments().getInt("title"))
.setPositiveButton(R.string.ok, (DialogInterface.OnClickListener)getActivity())
.setNegativeButton(R.string.cancel, (DialogInterface.OnClickListener)getActivity())
.setView(inputView);
return builder.create();
}
}
注:具体的には、私は、単一のEditTextボックスと、このようなタイトルを含むダイアログを作成しました。
とにかく、アイデアはどんな活動から、私はこのような呼び出し作ることができる、ということである:
EditTextDialogFragment etdf = EditTextDialogFragment.newInstance(R.string.add_new_term, R.string.term_name);
etdf.show(getSupportFragmentManager(), "new_term");
を、いつ限り、私が活動にDialogInterface.OnClickListenerを実装するように、私はコールバックを取得しますユーザーはダイアログを終了します。だから私は、私の活動では、この方法があります:私ははい/いいえダイアログのためにこれと同じデザインを使用している
@Override
public void onClick(DialogInterface dialog, int whichButton) {
if (whichButton == DialogInterface.BUTTON_POSITIVE) {
Toast.makeText(getApplicationContext(), "Dialog finished!", Toast.LENGTH_SHORT).show();
}
}
をし、それは素晴らしい仕事をしていると私はそれを愛します。どのアクティビティからでも2行のコードで簡単に呼び出すことができ、カスタマイズされたタイトルのYes/Noダイアログを表示できます。次にonClickコールバックにはどのボタンが押されたかが含まれているため、ダイアログから必要な情報をすべて取得しています。
しかし、このEditTextダイアログでは、OnClickメソッド内のEditTextボックスからデータを取得する方法がわかりません。返された唯一の事は、押されたボタンとDialogInterfaceの参照です(私が知る限り、EditTextデータに手を加えることはできません)。私が見てきた
唯一の解決策は、このようなビルダーコード内OnClickListenerコードを埋め込む伴う:
builder.setItems(terms, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), inputView.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
それが必要とするすべてのアクティビティから使用することができ、一般的なダイアログクラスを作成するの全体の目的に反しエディットボックス。私は明白な何かを欠いていますかこれは不可能ですか?
Ah!もちろん!なぜ私はそれを考えなかったのか分からない。 –
これを読んだ人は、明示的にするために、findViewByIdを呼び出す前にダイアログをDialogオブジェクトにキャストする必要があります。 dialogはDialogInterface参照として提供され、findViewByIdは未定義です。 –
@ Clarence Simpson良い説明! –