DialogFragment を利用したカスタムダイアログからActivityに値を返す - Android

DialogFragment を利用したカスタムダイアログから呼び出し元のActivityへ値を返すコードを紹介します。

UI

以下のUIを作成します。

MainActivity

MainActivityにはボタンを1つ、TextViewを1つ配置します。buttonの"On Click"プロパティに"button1_click"を設定します。

dialog.xml

カスタムダイアログで表示するレイアウトファイルを追加します。TextView, EditText, Buttonを配置します。

コード

以下のコードを記述します。

MainActivity.java

package com.iPentec.dialogfragmentdemo2;

import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.support.v4.app.FragmentActivity;
import android.widget.TextView;

public class MainActivity extends FragmentActivity  {
  public String ReturnValue ="";
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  public void button1_click(View view){
    CustomDialogFragment cdf = new CustomDialogFragment();
    cdf.show(getSupportFragmentManager(),"dialog");
  }
  
  public void onReturnValue(String value) {
    TextView textview2 = (TextView)findViewById(R.id.textView2);
    textview2.setText(value);
  }
}
解説
button1_click()
  CustomDialogFragment cdf = new CustomDialogFragment();
  cdf.show(getSupportFragmentManager(),"dialog");
カスタム化したカスタムダイアログのDialogFragmentクラスを派生したのCustomDialogFragmentクラスのインスタンスを作成し、showメソッドを呼び出しダイアログを表示しします。
onReturnValue()
CustomDialogFragment側から値が返されるときに呼び出されるメソッドです。引数のvalueで値が引き渡されます。

  TextView textview2 = (TextView)findViewById(R.id.textView2);
  textview2.setText(value);
受け取った値は上記のコードによりTextViewに表示されます。

CustomDialogFragment.java

package com.iPentec.dialogfragmentdemo2;

import android.support.v4.app.DialogFragment;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.app.Dialog;
import android.os.Bundle;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.widget.EditText;

public class CustomDialogFragment extends DialogFragment {
  EditText editText1; 
  
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity());        
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    dialog.setContentView(R.layout.dialog);       
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    
    editText1 = (EditText)(dialog.findViewById(R.id.editText1));
    
    dialog.findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
      @Override 
      public void onClick(View v) {
        
        String text = editText1.getText().toString();
        MainActivity callingActivity = (MainActivity) getActivity();
        callingActivity.onReturnValue(text);
        
        dismiss(); 
      }
    });
    
    return dialog;
  }
}
解説
基本はこちらのコードとほぼ同等です。
onCreateDialog()
onCreateDialogメソッド内でdialogオブジェクトのfindViewByIdメソッドを呼び出しダイアログ内のコントロールを取得します。
  editText1 = (EditText)(dialog.findViewById(R.id.editText1));
onCreateDialog()メソッド内のボタンクリックイベントハンドラ
ボタンが押された場合には、呼び出し元のActivityのonReturnValue()メソッドを呼び出します。呼び出し元のアクティビティはgetActivity()メソッドで取得します。CustomDialogFragmentクラスのメンバ変数に呼び出し元のActivityのインスタンスを格納する方法ではうまく動作しません。
  @Override 
  public void onClick(View v) {
    String text = editText1.getText().toString();
    MainActivity callingActivity = (MainActivity) getActivity();
    callingActivity.onReturnValue(text);
        
    dismiss(); 
  }

実行結果

プロジェクトを実行します。下図の画面が表示されます。


[Button]をタップすると下図のダイアログボックスが表示されます。背景が透過しているため見づらいですが、画面の中央にダイアログが表示されています。


ダイアログボックスのEditTextに文字を入力します。


EditTextに文字を入力後、ダイアログの[Button]をタップするとダイアログが閉じ呼び出し元のActivityの画面に戻ります。呼び出し元のActivityのTextViewにダイアログボックスで入力した文字列が表示されます。


著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
掲載日: 2013-05-23
iPentec all rights reserverd.