Android NのAPIも必要ありません!
「Android Nの新機能」というタイトルのビデオを最近視聴した場合は、 マルチウィンドウサポートについて検討する時間があります。
マルチウィンドウは分割画面モードで動作します。つまり、2つのアプリケーションが同時に画面上に並んで表示されます。 この魔法がどのように機能するかを理解するために、私はすぐにドキュメントを調べて新しいAPIを探しました。
それらはそれほど多くないことがわかります。 マルチウィンドウをまったくサポートするかどうかを示すいくつかのXML属性、およびアプリケーションが現在マルチウィンドウモードで動作しているかどうかを知らせるいくつかの
Activity
メソッド。 そして、魔法はどこにありますか? 魔法はいつもここにありました 。
そして、魔法とはAndroidのリソースシステムを指します 。 最も強力な部分の1つは、さまざまな修飾子に応じて、サイズ変更、レイアウト、ドロウアブル、メニューなどの代替リソースを提供する機能です。
マルチウィンドウサポートは、アプリケーションがマルチウィンドウモードに入ると、アプリケーションが描画される領域のサイズに関連する構成パラメーターが変更されるという点で、リソースシステムに基づいています。 このようなパラメータの明白な例は、画面サイズであり、やや不明瞭ですが、最小の幅(つまり、画面の高さと幅の間の最小値)と向きも変わります。
そして、それが最初のヒントになります。
最初のヒント:適切なコンテキストを使用する
適切なリソースをダウンロードするには、 適切なコンテキストが必要です。 アクティビティコンテキストを使用してリソースを取得したり、レイアウトファイル用のウィジェットの階層を作成したりする場合は、問題ありません。
ただし、グラフィカルインターフェイスに接続しやすいアプリケーションコンテキストを使用すると、ロードされたリソースがマルチウィンドウをまったく気付かないことがわかります。
Activity
のテーマを使用していないという事実に関連する問題に加えて、完全に誤ったリソースをダウンロードする場合があります! したがって、
Activity
コンテキストを使用して、UIに必要なリソースをロードすることをお勧めします。
2番目のヒント:構成の変更を正しく処理する
正しいコンテキストを使用すると、現在の画面サイズを知っている(アプリケーションがフルスクリーンモードであるか、他のユーザーと画面を共有しているかに関係なく)正しいリソースを確実にダウンロードできます。 正しいリソースをリロードするプロセスは、構成の変更を元に戻す方法に基づいています 。
デフォルトでは、構成の変更は次のように発生します。すべての
Activity
破棄されてから再作成され、 onSaveInstanceState()に保存したすべてのデータが復元され、すべてのリソース/レイアウトがリロードされます。 同時に、必要なものはすべて新しい構成と一貫性があり、 各タイプの構成が処理されることが確実にわかります。
構成の変更はすべて迅速に行う必要があることは言うまでもありません。 onResume()で多くの作業を行わないことを確認し、 ローダーを使用して、構成が変更されたときにデータを保存および復元することを検討してください。
ただし、構成の変更を自分で処理することもできます。この場合、アクティビティ(およびフラグメント)は破棄されません。 onConfigurationChanged()メソッドを呼び出します。このメソッドでは、ウィジェットを手動で更新したり、リソースをリロードしたりする必要があります。
マルチウィンドウに関連付けられた構成の変更をインターセプトするには、少なくとも次の値を持つandroid:configChanges属性をマニフェストに追加する必要があります。
<activity android:name=".MyActivity" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" />
変更可能なすべてのリソースを処理するようにしてください(実際、構成の変更を自分で処理する場合は、これを実行する必要があります)。
これは、以前定数と考えていたリソースの再読み込みにも適用されます。 たとえば、valuesとvalues-sw600dpで定義されたディメンションを示すリソースがあります。 マルチウィンドウが表示されるまで、アプリケーションの実行中にこれらの2つの値を切り替えることはありません。最小幅は変更されないためです(常にデバイスの画面の2次元のうち小さい方に等しくなります)。 これで、アプリケーションが描画される領域のサイズを変更した後、これらのリソースを切り替えることができます。
3番目のヒント:すべての画面の向きで動作する
最初に、ウィンドウのサイズが変更されたときに発生する方向の変更について説明したことを覚えていますか? はい、はい: デバイスが横向きモードであっても、アプリケーションは縦向きになります。
すべてが非常に単純です。「縦」方向は、高さが幅よりも大きいことを意味し、「風景」はその逆です。 したがって、アプリケーションは、マルチウィンドウモードに切り替えるときに、実際にある方向から別の方向に切り替えることができます。
また、これは、方向間の移行が可能な限りスムーズであることも意味します。 分割画面モード専用の材料設計仕様のセクションを引用します 。
デバイスの向きを変更しても、インターフェイスが予期せず変更されることはありません。 たとえば、2つのハーフスクリーンのいずれかでビデオを再生するアプリケーション(ポートレートモード)は、デバイスがランドスケープモードになった場合にフルスクリーンモードでビデオを再生するように切り替えないでください。
注 :アプリケーションが全画面モードのときにこの動作を実装する必要がある場合は、inMultiWindowMode()メソッドを使用して現在のモードを確認できます。
マルチウィンドウは、 android:screenOrientation属性を使用して画面の向きを厳密に設定する機能にも影響します 。 Android N(Marshmallow以下が
targetSdkVersion
として登録されている)をサポートしないアプリケーションでこの属性を使用すると、マルチ
targetSdkVersion
サポートされなくなり
targetSdkVersion
-ユーザーは常にマルチウィンドウモードからスローされます。 Android Nをサポートすることにした場合、動作が変わります。マルチウィンドウモードに切り替えた場合、
android:screenOrientation
動作は無視されます。
setRequestedOrientation()を使用して方向を修正しようとしても、Nをサポートしているかどうかにかかわらず、マルチウィンドウモードでは効果がないことを忘れないでください。
4番目のヒント:すべての画面サイズに対応するレスポンシブインターフェイスを作成する
マルチウィンドウモードの可能性を考慮して設計を設計する場合、画面サイズだけでなく考慮に入れる必要があります 。 マルチウィンドウモードは、タブレット用に作成したインターフェース(初めてですか?そうですね、14億台のデバイスの12.5%が多くのデバイスです...)が小型サイズに縮小するのは初めてです。
特定の画面サイズに縛られず、電話とタブレットのレイアウトが互いに比較的似ているレスポンシブインターフェイスを設計した場合、マルチウィンドウに十分に対応できます。 一般に、今後の変更に備える方法についての推奨事項があります。高さ/幅が220dpしか使用できないことを想定し、残りのスペースを追加として考慮してください。 そして、この制限を念頭に置いてインターフェースを作り直してください。
ただし、タブレットと電話のインターフェイスが大きく異なる場合(2つを切り替えてユーザーに脳を吹き飛ばさないでください)、タブレットのインターフェイスをそのままにして、電話の場合に適用できるように減らすようにしてください。 ユーザーにサイズ変更を見えなくするために適用できるレスポンシブインターフェースを構築するためのテンプレートがいくつかあり、このためにAndroid NのAPIは必要ありません。
5番目のヒント:他のアプリケーションによって起動されるActivity
は、常にマルチウィンドウ操作をサポートする必要があります。
マルチウィンドウの世界では、 タスクは単一のウィンドウで表されます。 したがって、 隣接する
Activity
を開始する場合は、新しいタスク(新しいタスク、新しいウィンドウ)を開始する必要があります。
そして逆もまた真であり、同じページを引用します。
既存のタスクスタックでActivity
を実行すると、画面に表示されていたActivity
が新しいActivity
置き換えられ、すべてのマルチウィンドウプロパティが継承されます。
これは、他のアプリケーションで起動できる
Activity
がある場合、起動時にそれを起動した
Activity
マルチウィンドウプロパティを継承することを意味します。 最小サイズを含む。 startActivityForResult()の場合 、
Activity
は同じタスクスタックの一部になり、明示的な
Intent
を介して起動された場合でも、 FLAG_ACTIVITY_NEW_TASKフラグで起動されるという保証はありません。
したがって、他のアプリケーションから起動できるアクティビティ(およびアクティビティから起動できるアクティビティ) はそれぞれ 、最小画面サイズまでのマルチウィンドウをサポートする必要があります。 慎重にテストしてください!
繰り返します:テスト!
マルチウィンドウの準備をする最良の方法は、アプリケーションをテストすることです。 コードをすぐに書き換えたり、Android N SDKをインストールしたりせずに、アプリケーションをエミュレーターやAndroid Nを搭載したデバイスに配置しただけでも、アプリケーションを改善するために大きな一歩を踏み出すでしょう。
詳細を知りたい場合は、 Android Development Patterns Collectionにサインアップしてください!