現在Activity.showDialog(DIALOG_ID);
を使用しているダイアログを移行して、android referenceで説明したDialogFragment
システムを使用しています。ここで方向変更時のDialogFragmentコールバック
簡単なダイアログのいくつかのサンプルコードです:
public class DialogTest extends DialogFragment {
public interface DialogTestListener {
public void onDialogPositiveClick(DialogFragment dialog);
}
// Use this instance of the interface to deliver action events
static DialogTestListener mListener;
public static DialogTest newInstance(Activity activity, int titleId, int messageId) {
udateListener(activity);
DialogTest frag = new DialogTest();
Bundle args = new Bundle();
args.putInt("titleId", titleId);
args.putInt("messageId", messageId);
frag.setArguments(args);
return frag;
}
public static void udateListener(Activity activity) {
try {
// Instantiate the NoticeDialogListener so we can send events with it
mListener = (DialogTestListener) activity;
} catch (ClassCastException e) {
// The activity doesn't implement the interface, throw exception
throw new ClassCastException(activity.toString() + " must implement DialogTestListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int titleId = getArguments().getInt("titleId");
int messageId = getArguments().getInt("messageId");
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// dialog title
builder.setTitle(titleId);
// dialog message
builder.setMessage(messageId);
// dialog negative button
builder.setNegativeButton("No", new OnClickListener() {
public void onClick(DialogInterface dialog, int id) {}});
// dialog positive button
builder.setPositiveButton("Yes", new OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mListener.onDialogPositiveClick(DialogTest.this);
}});
// create the Dialog object and return it
return builder.create();
}}
バックダイアログを開いたアクティビティ/フラグメントにいくつかのイベントを提供するためにコールバックを使用しているとき、私の開発中に発生した質問がありますそして、それを呼び出すアクティビティコードは次のとおりです。
public class SomeActivity extends FragmentActivity implements DialogTestListener {
private EditText mUserName;
@Override
public void onCreate(Bundle savedInstanceState) {
// setup ui
super.onCreate(savedInstanceState);
setContentView(R.layout.ui_user_edit);
// name input
mUserName = (EditText) findViewById(R.id.userEdit_editTextName);
}
@Override
public void onDialogPositiveClick(DialogFragment dialog) {
Log.d(TAG, this.toString());
mUserName.setText(mUserName.getText() + "1");
}
private void showDialog() {
DialogTest test = DialogTest.newInstance(SomeActivity.this, R.string.someTitleText, R.string.someMessageText);
test.show(getSupportFragmentManager(), "testDialog");
}}
このコードは、参考になるものです。問題は、いったんオリエンテーションを変更すると、ダイアログが表示され、期待どおりに動作しなくなることです。>アクティビティのライフサイクルのために、アクティビティとダイアログが再構築され、ダイアログに適切な新しい再構築されたアクティビティへの参照。私は予想される動作を取得し、姿勢の変化が発生したときにダイアログが新たに再構築された活動に戻ってイベントを送信し、これを実行
@Override
protected void onResume() {
super.onResume();
DialogTest.udateListener(this);
}
:
は、私は私のactivitysにonResumeメソッドを次のコードを追加しました。質問: オリエンテーションの変更中にFragmentActivityによって開かれたDialogFragment間のコールバックを処理するための「ベストプラクティス」とは何ですか?
お礼
あなたが1つ多くの断片の落とし穴に倒れたような音。私はあなたと同じ問題を抱えていました。この優れた記事http://code.hootsuite.com/orientation-changes-on-android/を読んでいる間に修正することができました。 –