7

方向の変更が発生したときに、特定のデバイス サイズでアクティビティとフラグメントを切り替えると問題が発生します。私の場合はlarge画面ですが、アプリによっては他の画面サイズでも発生する可能性があります。私は答えを探しましたが、これに適切に対処するものは何もないようです。

MainActivity と SubordinateActivity という 2 つのアクティビティがあります。MainActivity はアプリへの唯一のエントリ ポイントです。MainActivity は SubordinateActivity を起動します。各アクティビティには、MainFragment と SubordinateFragment という独自のフラグメントがあります。デバイスで実行する場合normal、画面の向きに関係なく、一度に 1 つのフラグメントに対して十分なスペースしかありません。その場合、各アクティビティは独自のフラグメントを管理します。xlargeデバイスでは、向きに関係なく、2 つのフラグメントを格納できる十分なスペースがあります。この場合、画面上に 2 つのフラグメントを許可するさまざまなレイアウト ファイルがあります。MainFragment と SubordinateFragment の両方が MainActivity によって管理されます (SubordinateActivity は使用されません)。

問題はlarge画面で発生します。横向きを使用すると、2 つのフラグメントに十分なスペースがありますが、縦向きでは十分ではありません。それぞれに適切なレイアウト ファイルがあります。横向きモードでは MainActivity が両方のフラグメントを管理し (xlargeデバイスと同様)、縦向きモードでは各アクティビティが独自のフラグメントを管理します (normalデバイスと同様)。これにより、次の 2 つのシナリオで問題が発生します。

  1. SubordinateActivity は縦モードで読み込まれ、向きが横モードに変わります。私が欲しいもの: SubordinateActivity を破棄し、MainActivity をロードする必要があります。SubordinateActivity によって以前に表示されたコンテンツは、独自の SubordinateFragment に表示されます。問題: SubordinateActivity は、ランドスケープ モードで単独でロードされたままになります。
  2. MainActivity は MainFragment と SubordinateFragment をランドスケープ モードで読み込み、向きはポートレートに切り替わります。私が欲しいもの: 以前に SubordinateFragment に表示されていたコンテンツは、SubordinateActivity によって単独で表示されるようになりました。問題: MainActivity が MainFragment のコンテンツのみで表示されます。

この問題の良い例は、GMail アプリです。私が話していることが明確でない場合に備えて、そのアプリのスクリーンショットをいくつか示します。GMail アプリの UI は実際には私のものよりも複雑ですが、問題は同じです。

GMail メッセージ一覧 GMail メッセージ表示

大型デバイスで横向きの GMail

これは、GMail 開発者も遭遇したため、他の人が遭遇した問題であると確信しています。すべての可能性には、Android UI のベスト プラクティスに違反するか、アクティビティ コードと XML レイアウトの間に不敬虔なもつれを作成することが含まれているように思われるため、どのような解決策が良いのかわかりません。

ここに私が持っているいくつかのアイデアがありますが、どれも本当に正しいとは思えません:

  • 両方のアクティビティで向きの変化を検出し、他のアクティビティを起動して (たとえば、FLAG_ACTIVITY_CLEAR_TOP を使用して)、スタックを下に戻り、以前に読み込まれたアクティビティを新しい意図で読み込みます。方向変更コードはデバイス上でのみ実行する必要があるため、これは問題ですlarge。つまり、どのレイアウトが利用可能かをチェックするコードがアクティビティ コードに混在することになります。
  • SubordinateActivity を完全に削除します。それは少し余分なようで、normal必要に応じて MainFragment と SubordinateFragment を交換できるサイズのデバイスでも、MainActivity はフラグメント自体を管理できます。結局、これで問題が解決するとは思いません。なぜなら、MainActivity は依然としてレイアウト ファイルに依存して、どのフラグメントをいくつ表示するかを指示しているからです。これは、アクティビティがユーザーが行う個別のことを表すという原則にも違反します。

この問題を解決するために私が調べたいくつかのリソースを次に示します。私が言ったように、これは一般的な問題のようですが、標準的な Android ソリューションはないようです。ドキュメントではフラグメントの使用が推奨されており、使用するすべての開発者がこの問題に遭遇するため、これは少し欠点です。

概要: デバイスでマルチペイン モードが機能していxlargeます。large私が解決しようとしている問題は、横向きの複数のペインしか処理できないデバイスで、単一ペイン (縦) モードと複数ペイン (横) モードを切り替えることです。

4

1 に答える 1

3

アプリケーションSubordinateActivityの唯一のエントリ ポイントをMainActivity強制終了して、ビューポート全体をMainFragmentまたはで埋めることを決定しますSubordinateFragmentリンク先の設計ガイドの開発者向けドキュメントを参照すると、これを行う方法の例を見つけることができます。

res/layout/large-land これを行った後、ここで説明されているように、大規模および横長専用のリソース フォルダーを作成し、レイアウト ファイルをセットアップしてMainActivity、前の段落のリンクのレッスン #2 と同様の 2 つのフラグメントを含めることができます。

それを作成し、通常の XML レイアウトをそのドキュメントで説明されているものに変更すると、方向の変更は技術的にはアクティビティの再作成であるため、記述しているすべてを自動的に処理する必要があります。

于 2013-08-30T15:00:43.637 に答える