2

私のアプリには、いくつかのフラグメントを含む 1 つのアクティビティがあります。しかし、フラグメント(JungleInfo)に移動すると、メニューボタンを押して携帯電話の「表示」セクションに移動し、Androidデバイスのフォントを変更します例)NormalからLargeまたはLargeからNormalに変更します。それをしたら、アプリのテキストが拡大/縮小し、他のアプリで見たのと同じフラグメント上にあるはずだと考えてアプリをもう一度開きますが、代わりにクラッシュします。

この Log.i コード スニペットは、Activity (MainActivity) -> ListFragment (JungleList-Fragment) -> Fragment (JungleInfo-Fragment) に移動したときのものです。

10-01 12:47:45.193: I/MainActivity(1039): onCreate
10-01 12:47:45.453: I/MainActivity(1039): onStart
10-01 12:47:45.483: I/MainActivity(1039): onResume
10-01 12:47:50.913: I/Jungle-ListFragment(1039): onAttach
10-01 12:47:50.923: I/Jungle-ListFragment(1039): onCreateView
10-01 12:47:50.993: I/Jungle-ListFragment(1039): onActivityCreated
10-01 12:47:52.244: I/Jungle-ListFragment(1039): onDestroyView
10-01 12:47:52.244: I/JungleInfo-Fragment(1039): onAttach
10-01 12:47:52.244: I/JungleInfo-Fragment(1039): onCreate
10-01 12:47:52.244: I/JungleInfo-Fragment(1039): onCreateView
10-01 12:47:52.924: I/JungleInfo-Fragment(1039): onActivityCreated

今、デバイスのフォントサイズを変更してから、アプリを再起動したところ、次のようになりました。

10-01 12:48:23.533: I/JungleInfo-Fragment(1039): onPause
10-01 12:48:23.533: I/MainActivity(1039): onPause
10-01 12:48:24.253: I/MainActivity(1039): onStop
10-01 12:48:54.313: I/JungleInfo-Fragment(1039): onDestroyView
10-01 12:48:54.373: I/MainActivity(1039): onDestroy
10-01 12:48:54.483: I/Jungle-ListFragment(1039): onAttach
10-01 12:48:54.503: I/JungleInfo-Fragment(1039): onAttach
10-01 12:48:54.503: I/JungleInfo-Fragment(1039): onCreate
10-01 12:48:54.503: I/MainActivity(1039): onCreate
10-01 12:48:55.423: I/JungleInfo-Fragment(1039): onCreateView
10-01 12:48:55.483: D/AndroidRuntime(1039): Shutting down VM
10-01 12:48:55.483: W/dalvikvm(1039): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
10-01 12:48:55.513: E/AndroidRuntime(1039): FATAL EXCEPTION: main
10-01 12:48:55.513: E/AndroidRuntime(1039): java.lang.RuntimeException: java.lang.NullPointerException

これをたどってnullになっているものを見つけたところ、これがわかりました。

私の JungleInfo クラスには、次のものがあります。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
    jungleChoice = ((MainActivity)getActivity()).fragmentDataJungle.toString();  //This is null when the app gets loaded up again after a device font change.
...
}

これを使用して、ListFragment でユーザーが選択したものを次のフラグメントに伝えるため、最初の実行は null ではありませんが、終了してデバイス フォントを変更し、アプリを再入力すると null になります。

他の StackOverflow の質問と Android 開発者ページで集めたものから、 http: //developer.android.com/reference/android/app/Fragment.html#Layoutアクティビティまたはフラグメントのライフサイクルで何かをする必要があると思います(具体的にはonPause()、onResume()、またはonCreateView()メソッドのフラグメントについて収集したものから)それはsavedInstanceStateを扱うため)jungleChoiceに保持されているものを保存します。しかし、この場合、これを onPause() に保存してから onResume()/onCreateView() にロードする方法がわかりません。ここで私の問題が何であるか、または可能な解決策について誰かが光を当てることができますか?

4

1 に答える 1

1

状態を永続化するためのオプションに関する適切な議論については、このリンクを試してください。一般に、savedInstanceStateは向きの変更などの一時的な状況に適していますが、永続性を長くするには、SQLiteまたはSharedPreferencesを検討することをお勧めします。

インスタンス状態の保存を使用してAndroidアクティビティの状態を保存する

幸運を。

于 2012-10-01T16:00:03.553 に答える