動的に作成されたビューで作業するときに画面の向きを処理する最良の方法はありますか?
-
29-09-2019 - |
質問
私のアプリの特定のアクティビティを開始するとき、ユーザーは、進行するためにデータを記入する必要があるというダイアログで「歓迎」されます。次に、アクティビティ自体で、ユーザーは2つのボタンを持っているため、無限の数のフィールドを動的に作成および削除できます(いくつかのビューで構成されています)
ご存知のように、画面の向きが変化すると、すべての情報が失われるようにアクティビティが再起動されます。明らかに、これには問題があります。
画面の向きを処理するために、Androidドキュメントは開発者に使用するようにアドバイスします onretainnonConfigurationInstance(). 。唯一の問題は、それを使用してコンテキスト内でオブジェクトを保存すると、結ばれたすべてのビューがリークすることです。私の場合、これはさらに問題があります。なぜなら、そのアクティビティのデータは本質的にその見解に結び付けられており、それはその文脈と結びついているからです。
Androidドキュメントは、開発者が構成の変更自体を処理することを推奨していません。彼らは「一般的に、後で彼らの生活を複雑にするのは短期的な解決策である」と述べています。
最初のダイアログを簡単にバイパスして、hasbeenshown booleanを作成して、たとえば真実に設定できます。メタデータを保存することで「動的に作成されたビュー」問題をバイパスすることもできます。この場合、生成されたフィールドの数、互いに相対的な位置、テキストや選択など...バグ、しかし深刻なことは何もありません)。
ただし、フィールド(ビュー)はレイアウトフロートで動的に生成されるため(したがって、無限の数のビューを持つことができます)、画面の向きの変更後に同じフィールドを再生成すると、エミュレータでもアプリケーションが非常に遅くなります。実際のデバイス(Samsung Galaxy S)に20個のフィールド(約120回のビュー)があるため、完了するまでに1分近くかかりました。
奇妙なことに、私がビューを直接渡したとき(したがって、すべてのものを漏らしている)、Samsumg Galaxyは10秒未満で完了しました。
この情報で、それが最良のアプローチは何だと思いますか?
(1) - フィールドをリセットさせますか? (実際には選択肢ではありませんが、画面を不注意に傾けると、誰もが腹を立てると確信しています= p)
(2) - Androidが画面の向きの変化に対応している間にロード画面を追加しますか?
(3) - 画面の向きの変更をブロックします
(4) - ハンドル画面の向きを自分で変更し、妨害する運命のAndroidドキュメントが決して来ないことを願っています。
PS:少しオフトピックですが、アクティビティが終了すると、すべてのメモリがリリースされますか?
解決
あなたの状況は私の状況とは異なりますが、同様の解決策が整っている可能性があります。
繰り返しますが、Androidはオリエンテーションの変更を破壊し、再現するため、最初はネットワーク通信を行うAsyncタスクに問題がありました。明らかに、最初のオリエンテーションがまだ実行されているときに、すべてのオリエンテーションの変更で新しいリクエストを作成するべきではありません。
いくつかのネットワークの使用と頭痛を節約するために、私は自分でオリエンテーションを変えるだけ「処理」します。このコードをAndroidManifest.xmlに配置します
<activity android:name=".whatever" android:configChanges="keyboardHidden|orientation"/>
Androidは、ビューや変数などを備えた現在のコンテキストを維持することを許可します。レイアウトは自分自身のサイズを変更しますが、正しく設計されていれば大丈夫です。
Afaik Androidが行うことを妨げているのは、デバイスの向きに基づいて特殊なレイアウトを使用することです(私は必要ありません)。