4

(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");   
}   
4

2 に答える 2