2011-08-15 19 views
3

さまざまな状況で異なるアクティビティで一般的に使用できるカスタムダイアログクラスをいくつか作成したいと決めました。最新の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(); 
     } 
    }); 

それが必要とするすべてのアクティビティから使用することができ、一般的なダイアログクラスを作成するの全体の目的に反しエディットボックス。私は明白な何かを欠いていますかこれは不可能ですか?

答えて

5

これは非常によくある質問であり、本当に簡単な解決策です。コントロールを取得するには、新しいダイアログをビューとして使用するだけです。このような

何か..あなたで次に

EditText editTextFromDialog = (EditText)dialog.findViewById(the_editText_ID); 

のonclickハンドラ、限り、あなたはあなたができるあなたのニーズに合わせて範囲を変更する必要がありますない場合は、(宣言コントロールのスコープ内にあるよう。ちょうど私が活動中のonclickメソッドを実装し

優れ

String dialogInput = editTextFromDialog.getText().toString(); 
+0

Ah!もちろん!なぜ私はそれを考えなかったのか分からない。 –

+4

これを読んだ人は、明示的にするために、findViewByIdを呼び出す前にダイアログをDialogオブジェクトにキャストする必要があります。 dialogはDialogInterface参照として提供され、findViewByIdは未定義です。 –

+0

@ Clarence Simpson良い説明! –

0

を、コンテンツを取得し、それが動作します:

public class MainActivity extends FragmentActivity implements OnClickListener { 

    protected void button1ActionPerformed() { 
     // TODO Auto-generated method stub 
     newFragment = new InputDialogFragment().newInstance(R.string.send_trasnsactions, R.string.dialog_fire_missiles, R.string.dialog_fire_missiles); 
     newFragment.show(getSupportFragmentManager(), "missiles"); 

    } 

@Override 
    public void onClick(DialogInterface dialog, int whichButton) { 
     Dialog x = (Dialog)dialog; 
     EditText editTextFromDialog = (EditText)x.findViewById(2000); 
     if (whichButton == DialogInterface.BUTTON_POSITIVE) { 
      Log.i("x:"+editTextFromDialog.getText().toString(), "Ok"); 
     }else{ 
      Log.i("x", "cancel"); 
     } 
    } 

} 
関連する問題