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の積極的な活用にも取り組み中。
とっても恥ずかしがり。