DialogFragment
が、終了時にeditQuantity
に入力された値を返すようにします。
しかし、私はそれを機能させる方法を得ていません。 intent
を介して値を渡すことでこれを行うことができますが、現在のアクティビティの進行を破壊します。
値を返すintent
を通過する以外の方法はありますか?
package com.example.myprojectname;
import Android.app.AlertDialog;
import Android.app.Dialog;
import Android.content.DialogInterface;
import Android.content.Intent;
import Android.content.DialogInterface.OnClickListener;
import Android.os.Bundle;
import Android.support.v4.app.DialogFragment;
import Android.text.InputType;
import Android.util.Log;
import Android.widget.EditText;
public class QuantityDialogFragment extends DialogFragment implements OnClickListener {
private EditText editQuantity;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
editQuantity = new EditText(getActivity());
editQuantity.setInputType(InputType.TYPE_CLASS_NUMBER);
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.app_name)
.setMessage("Please Enter Quantity")
.setPositiveButton("OK", this)
.setNegativeButton("CANCEL", null)
.setView(editQuantity)
.create();
}
@Override
public void onClick(DialogInterface dialog, int position) {
String value = editQuantity.getText().toString();
Log.d("Quantity: ", value);
dialog.dismiss();
}
}
呼び出しアクティビティに結果を送りたいと仮定すると:)このコードスニペットを試してください:
public class QuantityDialogFragment extends DialogFragment implements OnClickListener {
private EditText editQuantity;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
editQuantity = new EditText(getActivity());
editQuantity.setInputType(InputType.TYPE_CLASS_NUMBER);
return new AlertDialog.Builder(getActivity()).setTitle(R.string.app_name).setMessage("Please Enter Quantity")
.setPositiveButton("OK", this).setNegativeButton("CANCEL", null).setView(editQuantity).create();
}
@Override
public void onClick(DialogInterface dialog, int position) {
String value = editQuantity.getText().toString();
Log.d("Quantity: ", value);
MainActivity callingActivity = (MainActivity) getActivity();
callingActivity.onUserSelectValue(value);
dialog.dismiss();
}
}
そしてあなたの活動に追加:
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
QuantityDialogFragment dialog = new QuantityDialogFragment();
dialog.show(getSupportFragmentManager(), "Dialog");
}
/**
* callback method from QuantityDialogFragment, returning the value of user
* input.
*
* @param selectedValue
*/
public void onUserSelectValue(String selectedValue) {
// TODO add your implementation.
}
}
この考えをもう少し進めて、ダイアログ内にリスナーインターフェイスを作成し、メインアクティビティに実装しました。
_public interface OnDialogResultListener {
public abstract void onPositiveResult(String value);
public abstract void onNegativeResult();
}
public void setOnDialogResultListener(OnDialogResultListener listener) {
this.onDialogResultListener = listener;
}
_
ダイアログで値を返す場所であるオーバーライドされたonCancel(DialogInterface)
およびonPositiveResult(String)
内でonNegativeResult()を呼び出します。
注:dismiss()
を呼び出した後、ダイアログをonPositiveResult()
することを忘れないでください。そうしないと、ダイアログウィンドウが開いたままになります。
次に、メインアクティビティ内で、次のようにダイアログのリスナーを作成できます。
_QuantityDialogFragment dialog = new QuantityDialogFragment();
dialog.setOnDialogResultListener(new QuantityDialogFragment.OnDialogResultListener() {
@Override
public void onPositiveResult(String value) {
//Do something...
}
@Override
public void onNegativeResult() {
//Do something...
}
});
_
これにより、後でダイアログを再利用しやすくなります。