問題タブ [android-savedstate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - ロードされたlistViewの状態をフラグメントに保存するには?
私は1つのアクティビティ、listViewを含むフラグメント、および各listViewアイテムの詳細を含むフラグメントを持っています。API からフラグメント データを取得しています。listViewに戻ったときに復元できるようにするには、ロードされた日付とlistViewの位置を正しく保存するにはどうすればよいですか? このソリューションを実装しようとしましたが、フラグメントのインスタンス状態をバックスタックに正しく保存するにはどうすればよいですか? しかし、listView を正しく復元できません。
私のメインアクティビティ
およびListFragment
現在、savedInstanceState は常に null ですが、何が欠けていますか?
android - SavedInstanceState は null ではありませんが、空です
ユーザーがViewPager
さまざまな入力を入力するフラグメントがいくつかあります。これらのフラグメントの 1 つに aDatePicker
と aTimePicker
が含まれており、(ユーザーが日付と時刻を選択したときに) JodaLocalDate
ととして保存しますLocalTime
。
ユーザーがフラグメント間をスワイプしていても、その入力を維持するために、日付と時刻を保存したいと思います。これが私のコードです:
そして私の中でonCreateView
:
私が直面している問題は、ユーザーがこのフラグメントに到達しても入力を入力せずに、前のフラグメントに戻って日付と時刻のフラグメントを選択すると、アプリが私のLog
行でクラッシュすることonCreateView
です.
selectedDate と selectedTime が null の場合にデータを保存しないようにしようとすると、フラグメントが再作成されるときにバンドルが null とは異なる理由がわかりません (もちろん、キーと値のペアは存在しません)。
これを解決する方法についてのアプローチを教えてもらえますか?この動作の説明をいただければ幸いです。
android - アクティビティに savedInstanceState バンドルを設定する
savedInstanceState Bundle を手動で設定する方法はありますか?
onCreate で savedInstanceState バンドルが null にならない、savedInstanceState モードでアクティビティを開始する必要があります。私のポイントは、カスタム データを使用してアクティビティを復元することです。ありがとう
android - インスタンスを Android フラグメントに保存
HomeFragment.java という Fragment があります。これは、アプリを開いたときに起動される最初のフラグメントです。このフラグメント内には、JSON を使用してサーバーからすべてのデータを取得する「onAsyncTaskDoInBackground」というメソッドがあります。
私がやろうとしているのは、「savedInstanceState」を使用して、「HomeFragment.java」が再度開かれるたびにすべてのデータを再ダウンロードしないようにすることです。
例:
ユーザーがアプリを開くと Homefragment.java が起動し、すべてのデータがダウンロードされます。ユーザーは about us ページに移動し、ホームページ (Homefragment、java) に戻り、すべてのデータが再度ダウンロードされます。(同じアプリの起動ですべてのデータを再ダウンロードする必要はありません)
HomeFragment.java
android - 動的に追加されたフラグメントの RecyclerView にカスタム ビューの状態を保存する方法は?
TL;DR:が をリサイクルしているときと を交換しているときRecyclerView
の の呼び出しを区別できません。onBindViewHolder
View
Fragment
ここSOで答えを探すのに多くの時間を費やしましたが、結局何もうまくいきませんでした。それがしたことは、答えはおそらく を使用することにあると教えてくれましたが、savedInstanceState
うまく使用できませんでした。
構造 :
- メインフラグメント
- メインビュー
- SwitchFragmentButton
にMainView
は がありFrameLayout
、 を保持するために使用されますFragment
。
最初のFragment
ものは重要ではありませんが、2 番目Fragment
のものは でありOverviewFragment
、その構造は次のとおりです。
- 概要フラグメント
- RecyclerView
- CustomItemView
- テキストビュー
- ChangeTextColorButton
- アイテムの削除ボタン
- ...
- CustomItemView
- AddItemButton
- RecyclerView
RecyclerView
リストを水平にする必要があり、それが最も簡単な方法であるため、を使用しています。
望ましい動作:
ボタンを2回クリックしたとき(フラグメントを変更して元に戻すとき)に色の変更を保持したいのですが、リストからアイテムを削除してから再度追加したときは保持しません。
問題 :
色は常に保持されるか、まったく保持されません。onBindViewHolder
のアダプターでテキストの色を設定するために使用RecyclerView
すると、バインドがフラグメントの置換 (変更された色を復元する場所) によるものか、ビューのリサイクル (復元しない場所) によるものかを区別できません。
コード :
はSwitchFragmentButton
のメソッドOnClickListener
を呼び出しますMainView
色の管理方法は次のとおりです(簡略化):
RecyclerView
のAdapter
定義は次のとおりです。
MyItem
ここに CustomItemView のコア項目があります (すべての MyItem にはその CustomItemView があり、すべての CustomItemView には MyItem があります)
ノート :
minSdkVersion
: 19.
編集 :
@goldenb のおかげで、問題が絞り込まれ、2 つの解決策が現れました。
解決策 1 :
フラグメントを置き換える代わりに、それらをすべて追加してから表示/非表示にします。
この解決策は何とか機能しますが、問題の本当の解決策ではありません。の削除を回避するFragments
ため、状態が維持されます。
ただし、私の質問は、Fragment
の状態を保存して復元する方法に関するものであるため、これを回答として受け入れることはできません。
解決策 2 :
オーバーライドOverviewFragment#onPause
して状態を保存し、 で復元しOverviewFragment#onCreate
ます。
この解決策はもっともらしいようで、現在調査中です。CustomItemView
ただし、データを からに再配置するには、プロジェクトで再構築が必要なMyAdapter
ため、しばらく時間がかかります。
android - フラグメントの savedInstanceState が機能しない
ここにはいくつかのフラグメントがあり、この 1 つのフラグメントは、戻ったときにその状態を保存したい場所です。ボタンをクリックすると、テキストビューのテキストが「test1」に変更されるテストフラグメントで試してみました(テキストビューのデフォルトのテキストは「新しいテキスト」です)。したがって、テキストビューはテキストを変更しますが、別のフラグメントに移動してそこに戻ると ( HomeFragment
)、テキストビューはデフォルトの状態のテキスト (「新しいテキスト」) になります。savedInstanceState
したがって、フラグメントに戻ったときに「test1」が必要なため、機能していないと思います。これが私のコードです:
android - GoogleMap オブジェクトの状態を復元する際の ClassNotFoundException
アクティビティから戻った後にGoogleMap
( ) オブジェクトの状態を復元しようとすると、アプリが一貫してクラッシュします。カスタム サポート ライブラリ v4 ( ) にあり、それ自体が( ) に埋め込まれています。これらのコンポーネントのセットアップは正常です。私のデバイスは、プッシュ時にすべての を破棄するように開発者が構成しています。mapView
mapView
Fragment
MyFragment
AppCompatActivity
MyActivity
Activity
別の をプッシュしてポップするとActivity
、 myFragment
のonCreateView(LayoutInflater, ViewGroup, Bundle state)
メソッドが呼び出され、クラッシュします
下部にトレースを生成します。
が の場合、最初の作成時にクラッシュは発生しません。クラッシュは、MultiDex または Proguard を有効または無効にする (私が見つけた) 組み合わせによって解決されません。state
null
実際、私ができることは、Instant Run を有効にして Android Studio から直接実行することだけです。この場合、すべて問題ありません。Instant Run を無効にして Android Studio から実行すると、クラッシュが発生します。
アップデート:
先週、Google は Android Build Tools v5.0.1 と Google Play Services v10.0 をリリースしました。更新後、この問題は解消されたようです。ただし、他のアイデアが現れるかどうかを確認するために、この質問は開いたままにします。以下の Aлекс のアイデアは、私がとにかく試すことができる良いアイデアです。