1

ユーザーがViewPagerさまざまな入力を入力するフラグメントがいくつかあります。これらのフラグメントの 1 つに aDatePickerと aTimePickerが含まれており、(ユーザーが日付と時刻を選択したときに) JodaLocalDateととして保存しますLocalTime

ユーザーがフラグメント間をスワイプしていても、その入力を維持するために、日付と時刻を保存したいと思います。これが私のコードです:

@Override
public void onSaveInstanceState(Bundle outState) {
    if (selectedDate != null && selectedTime != null) {
        outState.putString("date", selectedDate.toString());
        outState.putString("time", selectedTime.toString());
        super.onSaveInstanceState(outState);
    }
}

そして私の中でonCreateView

if (savedInstanceState != null){
    Log.d("mylog", savedInstanceState.getString("date");
    currentDate = LocalDate.parse(savedInstanceState.getString("date"));
    currentTime = LocalTime.parse(savedInstanceState.getString("time"));
    selectedDateTv.setText(currentDate.toString("dd/MM/yyyy"));
    selectedTimeTv.setText(currentTime.toString("HH:mm"));
} else {
    //My code
}

私が直面している問題は、ユーザーがこのフラグメントに到達しても入力を入力せずに、前のフラグメントに戻って日付と時刻のフラグメントを選択すると、アプリが私のLog行でクラッシュすることonCreateViewです.

selectedDate と selectedTime が null の場合にデータを保存しないようにしようとすると、フラグメントが再作成されるときにバンドルが null とは異なる理由がわかりません (もちろん、キーと値のペアは存在しません)。

これを解決する方法についてのアプローチを教えてもらえますか?この動作の説明をいただければ幸いです。

4

2 に答える 2

3

実装はそれを使用する唯一のものではないため、構成の変更後でBundleはありません。次の引用は のドキュメントからのものですが、ランタイムの変更の処理に記載されているように、 にも有効です。nullFragmentActivityFragment

ただし、何もせずに onSaveInstanceState() を実装しない場合でも、アクティビティの状態の一部は、onSaveInstanceState() の Activity クラスの既定の実装によって復元されます。具体的には、デフォルトの実装は、レイアウト内のすべてのビューに対して対応する onSaveInstanceState() メソッドを呼び出します。これにより、各ビューは、保存する必要があるそれ自体に関する情報を提供できます。

Bundleではないことを確認することに加えてnull、キー「日付」と「時刻」を持つエクストラが存在するかどうかを確認する必要があります。両方のキーを保存するか、何も保存しないので、そのうちの 1 つを確認するだけで十分です。

if (savedInstanceState != null
   && savedInstanceState.containsKey("date")
    ){
    Log.d("mylog", savedInstanceState.getString("date");
    currentDate = LocalDate.parse(savedInstanceState.getString("date"));
    currentTime = LocalTime.parse(savedInstanceState.getString("time"));
    selectedDateTv.setText(currentDate.toString("dd/MM/yyyy"));
    selectedTimeTv.setText(currentTime.toString("HH:mm"));
} 
else {
    //My code
}
于 2016-09-21T09:18:29.790 に答える
0

以下のようにメソッドを変更します

@Override
public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    if (selectedDate != null && selectedTime != null) {
        outState.putString("date", selectedDate.toString());
        outState.putString("time", selectedTime.toString());

    }
}
于 2016-09-21T08:45:19.847 に答える