5

私は両方のアプローチを使用しました:

  1. ローテーションでアクティビティを破棄します
  2. ローテーションでアクティビティを破棄しないでください

私のアプローチはほとんどの場合、回転イベントをキャッチし、必要に応じてsetContentViewを呼び出して、いくつかのコンポーネントを再度追加することです。そうでない場合は、回転させるだけで、レイアウトが適応するように設計されます。

これまでのところ、非常に動的で非常に複雑な構造の画面で破棄できるという利点しかありません。回転して破棄しない場合は、画面を再構築するときにちらつきが表示されます。

onSaveInstance、onRestoreInstaceを使用して状態を渡す必要があるオーバーヘッドは、エラーが発生しやすく、何らかの理由で時間がかかる場合があります。

私は何かが足りないのですか?

アップデート:

コードで「Orientation.XPTO==...」の場合は何もしていません。これは、2つのアプローチのそれぞれのロジックです(コードは再利用されます)。

破壊するとき

onCreate -> DrawUI() setContentView and add views -> fill() add content

破壊されていない場合:

onCreate -> DrawUI() setContentView and add views -> fill() add content
onRotation -> DrawUI() setContentView and add views -> fill() add content

回転後にsetContentViewを呼び出すと、デバイスの向きに適したレイアウトが選択されます(GoogleのReto Meier https://stackoverflow.com/a/456918/327011によるこの回答を確認してください)

また、DrawUIと塗りつぶしには、最初に2つの方向のそれぞれでアクティビティを作成できるため、縦向きと横向きの両方のレイアウトのロジックが必要になります。

4

5 に答える 5

10

私は何かが足りないのですか?

はい。あなたはあなたの代替案がどういうわけかエラーが発生しにくいと仮定しています。

破棄と再作成のサイクルを経ないことで、考えられるすべての構成変更に対してすべてのリソースの変更を処理していることを確認する必要あります

ローテーションでアクティビティを破棄しないでください

android:screenOrientationアクティビティを単一の方向(たとえば)に強制するために使用している場合を除き、landscape回転に関連する構成の変更のみを処理することはできません。すべての構成変更を処理する必要があります。そうしないと、ユーザーがデバイスをドックにドロップしたり、ドックからデバイスを削除したり、設定から言語を変更したり、キーボードを接続または取り外したり、グローバルフォントスケーリングを変更したりするとすぐに、アプリが壊れます。

つまり、構成を変更するたびに、次のことを行う必要があります。

  • 新しい可能性のある文字列リソースのUIを更新します
  • レイアウトを調整またはリロードします(そして、ドローアブル、アニメーション、メニューなどの変更を含む「調整」によって)
  • リソースに関連付けられているその他のもの(たとえば、の配列リストPreferenceFragment

問題は、何かを忘れてしまうことです。たとえば、アクションバーアイテムに関連付けられた文字列を変更できないため、UIのほとんどがスペイン語になり、そのアクションバーアイテムは英語になります。あなたが忘れようとしている種類のことはあまり明白ではありません(あなたはどのくらいの頻度であなたのスペイン語の翻訳をテストしますか?)。

于 2012-12-10T13:31:05.630 に答える
3

新しいオリエンテーションのために自分自身を再構成する機会を与えるために、あなたの活動は破壊されます。

developer.android.comから:

画面の向きが変わると、画面構成が変更され、アクティビティが代替リソース(レイアウトなど)をロードする必要がある場合があるため、システムはフォアグラウンドアクティビティを破棄して再作成します。

たとえば、横向きモードでは、まったく異なるレイアウトが必要な場合や、引き伸ばされていないように見えるグラフィックをロードしたい場合があります。これを行う最良の方法は、アクティビティを再度作成できるようにすることです。これにより、レイアウトファイルへのリンクをより方向付けしやすいレイアウトに変更できます。

詳細と向きの変更に対処する方法については、http://developer.android.com/training/basics/activity-lifecycle/recreating.htmlを参照してください。

レクリエーションを無効にしたい場合は、追加できます

android:configChanges="orientation"

AndroidManifest.xmlのActivity要素に追加します。このように、アクティビティは再ロードされません。

onSaveInstanceまた、onRestoreInstaceセッション情報(たとえば、の現在のテキスト)を渡すためにのみ使用する必要があり、TextFieldonCreateの後に再度ロードできる一般的なものはありません。

于 2012-11-30T15:18:24.917 に答える
2

アクティビティを再開する場合、大量のデータセットを回復する、ネットワーク接続を再確立する、またはその他の集中的な操作を実行する必要がある場合、を使用するonSaveInstanceState()と、前述の症状が発生する可能性があります。

  1. ユーザーエクスペリエンスが悪い(つまり、「ちらつきが見られる」)
  2. 大量のメモリを消費する必要がある

onSaveInstanceState()コールバックは、大きなオブジェクトを運ぶようには設計されていません。

ランタイム構成の変更中にオブジェクトを保持するには、次のようにします。

メソッドをオーバーライドして、onRetainNonConfigurationInstance()保持したいオブジェクトを返します。アクティビティが再度作成されたら、を呼び出しgetLastNonConfigurationInstance()てオブジェクトを回復します。

でも:

任意のオブジェクトを返すことができますが、アクティビティに関連付けられているオブジェクト(、、、、、またはに関連付けられDrawableているその他のオブジェクトなど)を渡さないでください。これを行うと、元のアクティビティインスタンスのすべてのビューとリソースがリークされます。(リソースをリークするということは、アプリケーションがリソースを保持し、ガベージコレクションできないため、大量のメモリが失われる可能性があることを意味します。)AdapterViewContext

ソース


スムーズに通過できない限り、Object個人的には構成変更を自分で処理する方が有利だと思います。つまり、破壊しないことを意味します。

13以上のターゲットAPIがある場合:に含める必要がありscreenSizeますconfigChanges。API 13以降、画面サイズも向きの変更に応じて変化するため、これを考慮する必要があります。13より前は、アクティビティがこれ自体を処理していました。

android:configChanges="orientation|screenSize"
于 2012-11-30T20:15:14.707 に答える
0

(Landscape / Portrait)に異なるレイアウトを使用している場合に便利な場合があります。たとえばListView、縦向きとGridView横向きなど、さまざまなタイプのビューを使用します。

于 2012-11-30T15:21:41.927 に答える
0

あなたはAndroidのレイアウトを作成する標準的な方法を検討していないと思います。私が間違っている場合は私を訂正してください。-port、-landを含む2つのresフォルダーを別々に使用して、Androidシステムに、方向に基づいて異なるアセットとレイアウトをロードするために実行時に選択するように指示していますか?

このは、さまざまな方向のレイアウトを管理するための手がかりを与えることができます。

これがAndroidの標準ドキュメントです。「土地」と「港」で確認してください。

これがお役に立てば幸いです。

于 2012-12-10T13:30:59.137 に答える