(Scherlock)FragmentActivity の EditText フィールドをクリックすると、DatePicker が表示されます。日付を選択して「適用」をクリックすると、Edittext フィールドに日付が入力されます。DatePicker が表示されている間に画面を回転させるまで、これは正常に機能します。その onCreateDialog メソッドが再び開始され、すべてが正しく見えます。しかし、「適用」をクリックすると、EditText フィールドに日付が入力されません。
これは、リスナーを保持できていないことが原因である可能性が最も高いです。この問題は DialogFragment と非常によく似ています - 画面の回転後にリスナーを保持しますただし、私のコードでは、DialogFragment にリスナー インターフェイスが含まれており、FragmentActivity の呼び出しからリスナーに到達できません (上記の質問で解決策が示唆されているように)。
- そうではないと思いますが、アクティビティが破棄される前にリスナーを保存する方法はありますか? (マニフェストの変更には興味がありません。)
- この DialogFragment を変更する方法はありますか、またはこの場合、含まれているインターフェイスを使用したこのソリューションは適切ではありませんか?
私を助けてください、これは本当に難しいことではないはずですが、私は認めるよりも長く取り組んできました...
DialogFragment コードは次のとおりです。
public class DateDialogFragment extends SherlockDialogFragment {
public static String TAG = "DateDialogFragment";
static Context mContext;
static int mYear;
static int mMonth;
static int mDay;
static DateDialogFragmentListener mListener;
public static DateDialogFragment newInstance(Context context, DateDialogFragmentListener listener, Calendar now) {
DateDialogFragment dialog = new DateDialogFragment();
mContext = context;
mListener = listener;
mYear = now.get(Calendar.YEAR);
mMonth = now.get(Calendar.MONTH);
mDay = now.get(Calendar.DAY_OF_MONTH);
return dialog;
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(mContext, mDateSetListener, mYear, mMonth, mDay);
}
private OnDateSetListener mDateSetListener = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
mListener.updateChangedDate(year, monthOfYear, dayOfMonth);
}
};
public interface DateDialogFragmentListener {
public void updateChangedDate(int year, int month, int day);
}
}
編集: これが私の FragmentActivity の一部です: DialogFragment を呼び出すために使用するメソッド:
public void showDatePickerDialog() {
now = Calendar.getInstance();
DateDialogFragment frag = DateDialogFragment.newInstance(
this, new DateDialogFragment.DateDialogFragmentListener() {
public void updateChangedDate(int year, int month, int day) {
birthdate.setText(String.valueOf(day) + "-" + String.valueOf(month+1) + "-" + String.valueOf(year));
now.set(year, month, day);
pet.setBirthdate(birthdate.getText().toString());
}
},
now);
frag.show(getSupportFragmentManager(), "DateDialogFragment");
}