13

アプリケーションを完成させ、複数の画面サイズへの適応を処理する必要があります。

この時点で、私の唯一の選択肢は次のことです。

小、標準、大、特大の画面サイズ用に個別の xml レイアウトを用意します。その中に、ldpi、mdpi、hdpi、および xhdpi 用に個別の xml レイアウトを用意します。ポートレートとランドスケープ用に、その中に個別の xml レイアウトを用意します。

これは、1 つのアクティビティに対して合計 32 のレイアウトです。

これには非常に時間がかかるため、これを行うためのより良い方法があるかどうか疑問に思っていますが、可能なすべてのデバイスをサポートする必要がある場合は気にしません.

私はいくつかの読書をしました、そして人々は線形レイアウトを使用し、それがパーセンテージであるため重力を使用すると言ったので、すべての画面で同じように見えます. または、RelativeLayout を使用して、「AlignAbove or below」などを使用することもできます。

ただし、私の主な問題は、要素の位置が一般的に正しい場所にあるように見えるのに、サイズが間違っていることです。

これを行うための広く受け入れられている方法はありますか?

私は、平均的な開発者がすべての画面サイズを処理する「メインストリーム」の方法を本当に探しています。

4

4 に答える 4

15

良い質問。しかし、あなたがしているやり方は、「プロの」開発者がするやり方ではありません。1 つのアクティビティに 32 のレイアウトは必要ありません。Android は物事を処理するのに十分なほどインテリジェントです。

レイアウトのマルチ定義/dimens.xml のマルチ定義なしで、マルチデバイス サポートは可能かどうか?

はい、それは絶対に可能であり、これはあなたがすべきことです。1 つのアクティビティ レイアウトに対して 32 のレイアウトを定義することは、良いことではありません。

Play ストアに 20 を超えるアクティビティを含むかなり大きなアプリがあるとします。1 つのアクティビティに 32 のレイアウトを定義した場合、アプリには 600 を超えるレイアウトが存在することになります。それは実現可能ですか?自問してみてください。

このページを非常によく読むことから始める必要があります。知っておくべきことがほとんどすべて含まれています。しかし、私はあなたが物事を正しくするのを手伝います。

画面サイズと密度のすべての組み合わせに対して代替リソースを提供する必要はありません。システムは、適切なサイズ変更を可能にする手法を使用して UI を実装していれば、任意のデバイス画面でアプリケーションをレンダリングする作業のほとんどを処理できる堅牢な互換性機能を提供します。

このステートメントは、これを行うべきではないことを納得させるのに十分です. Android システムは、それに応じてレイアウトのサイズを変更できるほどインテリジェントです。そして、私を信じてください、それは本当に良いことです。

さまざまな画面サイズに合わせて UI を設計すると、各設計に最小限のスペースが必要であることがわかります。したがって、上記の一般化された各画面サイズには、システムによって定義された関連付けられた最小解像度があります。これらの最小サイズは「dp」単位です。これは、レイアウトを定義するときに使用する単位と同じです。

私はあなたが考慮する必要がある重要なことのいくつかを指摘しようとします.

  • レイアウトでピクセルをハードコードしないでください
  • レイアウトでは常にdporを使用してください。sp名前が示すように、それらはさまざまなデバイスの密度に依存しないため、すべてのデバイスで同じように見えます。
  • 高さと幅には常にwrap_contentorを使用しますmatch_parent
  • 絶対に使用しないでくださいAbsoluteLayout
  • RelativeLayoutまたはLinearLayout両方がうまく機能します。シナリオに応じて、どちらを使用するかを決定する必要があります
  • 画面サイズごとに異なるバージョンのドローアブルを常に提供してください。これはスキップできないものです。そうしないと、さまざまなデバイスでレイアウトが見栄えが悪くなるだけでなく、アプリが不要なリソースを消費することになります。
  • 単一のレイアウトはタブレットでもうまく機能しますが、テーブルの画面サイズは一般的な携帯電話の画面サイズよりもはるかに大きいため、テーブル専用に別のレイアウトを提供する必要があります。

Android Studio リッチ レイアウト エディタ

Android Studio には、レイアウトをすぐにプレビューできる素晴らしいレイアウト エディターがあります。以下のスクリーンショットをご覧ください。

ここに画像の説明を入力

アプリの特定の画面をさまざまな画面サイズで一度にプレビューしていますが、レイアウトはすべての画面で希望どおりに表示されます

このアクティビティには、すべての電話用とすべてのタブレット用の 2 つのレイアウトがあります。

実務の経験

実用的な体験が必要な場合は、さまざまな画面サイズの 8000 を超えるさまざまなデバイスで何千人ものユーザーが使用しているアプリを Play ストアで実行しています。

特定の Activityには、電話用とタブレット用の2 つのレイアウトしかありません。私のアプリの UI はすべてのデバイスで見栄えがよく、どのユーザーからも不満はありませんでした。必要に応じて、ここにアプリへのリンクがあります。

この詳細な回答がすべての疑問を解決できると確信しています。そうでない場合は、遠慮なくお知らせください。さらにお役に立てれば幸いです。

UDPATE

もう一度あなたの混乱を解消しようと思います。しかし、最初に、私の回答を複数回読むことをお勧めします。

必要なレイアウトは 1 つか 2 つですが、それはすべて、設計している特定のレイアウトによって異なります。すべてのレイアウトは他とは異なります。主観的なものとして技術的に定義することはできません。経験則はありません。しかし、私は正式にあなたを助けようとします。

Android Studio の Rich Layout Editorとその優れたライブ プレビュー機能をうまく活用する必要があります。

  • まず、平均的な端末サイズ(Nexus 5 の 5 インチなど)を対象としたレイアウトの設計を試みます。レイアウトをプレビューするには、Nexus 5 を選択するだけです。

  • デザインに満足したら、他の画面サイズを選択してプレビューします。上のスクリーンショットのように「すべてのサイズをプレビュー」を選択することもできます。

  • 4 インチから 10 インチのタブレットまで、すべての画面サイズでレイアウトが適切に表示されるかどうかを確認してください。間隔、画像サイズ、フォント サイズがすべて正しいかどうかを確認します。

  • 通常、4 インチから 6 インチまでのすべての携帯電話で完全なプレビューが表示されますが、タブレット画面用に別のレイアウトを個別に設計する必要がある場合があります (十分な大きさがあるため)。ここでのみ 2 つのレイアウトが必要になりますが、常にではありません。

私のアプリのように、5 ~ 6 個のアクティビティに対してのみ 2 つの別々のレイアウトを使用していますが、残りの部分では 1 つのレイアウトしか使用していません。それはすべて特定のレイアウトに依存します。

設計は、プログラミングとはまったく異なります。プログラミングは形式的にも文法的にも定義できますが、デザインは定義できません。デザインは完全に主観的なものであり、デザイナーの視点に依存します。独自の方法で創造性を発揮してください。それがデザインの魔法です

于 2015-08-13T05:09:02.007 に答える
3

ただし、私の主な問題は、要素の位置が一般的に正しい場所にあるように見えるのに、サイズが間違っていることです。

dp 単位と sp 単位を正しく使用していますか?

dp

Density-independent Pixels - 画面の物理密度に基づく抽象的な単位。これらの単位は、160 dpi (インチあたりのドット数) の画面を基準にしており、1 dp はほぼ 1 ピクセルに相当します。より高密度の画面で実行する場合、1 dp の描画に使用されるピクセル数は、画面の dpi に適した倍率で拡大されます。同様に、低密度の画面では、1 dp に使用されるピクセル数が縮小されます。dp とピクセルの比率は画面密度によって変化しますが、必ずしも正比例するとは限りません。(px 単位の代わりに) dp 単位を使用すると、レイアウト内のビューのサイズをさまざまな画面密度に合わせて適切にサイズ変更するための簡単なソリューションになります。つまり、さまざまなデバイス間で UI 要素の実際のサイズに一貫性を持たせることができます。

sp

Scale-independent Pixels - これは dp 単位に似ていますが、ユーザーのフォント サイズ設定によってもスケーリングされます。フォントサイズを指定する場合は、この単位を使用することをお勧めします。画面密度とユーザーの好みの両方に合わせて調整されます。

アンドロイドのドキュメントから。

于 2012-06-10T19:14:58.197 に答える
1

ドキュメントを読むのは良いことだと思います。複数の画面のサポートに関するすべてのことを説明しています。

しかし、誰もがそれをいつ、どのように使用する必要があるかを混乱させています。

混乱する前にioschedのような公式のサンプル コードをダウンロードして、サポート画面をどのように管理しているかを理解してみてください。

初めてそのコードを理解するのは非常に難しいですが、私たちは開発者なので...

例: API 10-22 をサポートする 1 つの Android があり、すべてのデバイスは (Galaxy star s5280- 非常に小さな画面) から 10 インチ タブレット (Nexus 10) までです。

リソースの管理方法、


POINT-1まずはレイアウトから

以下のように2つのレイアウトを作成します

res/layout/my_layout.xml   
res/layout-sw600dp/my_layout.xml // 7 inch tablets

以下は、非常に小さいまたは大きいレイアウトが必要な場合に備えてオプションです

res/layout-small/my_layout.xml
res/layout-sw720dp/my_layout.xml // 10 inch tablets

POINT-2寸法でレイアウト管理もできる

res/values/dimens.xml
res/values-sw600dp/dimens.xml // 7 inch tablets
res/values-sw720dp/dimens.xml // 10 inch tablets

POINT-3異なるドローアブルを追加する

res/drawable-mdpi/graphic.png 
res/drawable-hdpi/graphic.png 
res/drawable-xhdpi/graphic.png 
res/drawable-xxhdpi/graphic.png 

私の経験によると、誰もがPOINT 1と2の組み合わせを使用し(要件に従って)、POINT-3は普遍的です:)。ベスト プラクティスを読む


<supports-screens>最後に<compatible-screens>Androidマニフェストファイルで使用することを忘れないでください


編集:

values-large と values-xlarge を使用できますか? values-large & values-sw600dp と混同しています

注: Android 3.2 (API レベル 13) 以降、これらのサイズ グループは廃止され、使用可能な画面幅に基づいて画面サイズを管理する新しい手法が採用されています。Android 3.2 以降向けに開発している場合は、Android 3.2のタブレット レイアウトの宣言を参照してください。

such as large or xlarge最初に上記のガイドラインを読んでください。それらに従って、単に使用する必要はありません600dp of width。それは >= 3.2 Android OS 用です。すべてのデバイスで動作することが期待されますが、GALAXY TAB-2、GRAND などの GALAXY シリーズのデバイスでは、values-large と values-xlarge を使用できる古い API があるため、問題が発生する可能性があります。これはデバイス固有の問題であり、必要な場合にのみ実行してください。


もう 1 つ注意してください。必要に応じてレイアウトの上に複数のファイルをlistview作成し、レイアウトにあるように、タブレットを含むすべてのデバイスに対して同じファイルを 1 つ作成するだけで、アプリのサイズも管理できます。

LINEAR、RELATIVE、FRAME のレイアウトにより、作業が楽になります。

于 2015-08-17T13:26:04.680 に答える
0

レイアウトを動的に設計することでこれを達成できます.すべての画面に適合できます.Androidでは、利用可能なモバイル画面について結論を出すことはできません.さまざまな解像度の画面がたくさんあります.UIを柔軟にするために.設計する必要があります.レイアウトを動的に。たとえば、すべての画面 (縦向き) を修正できる xml を 1 つ追加しました。

xml は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="10"
android:gravity="center">


<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="4"
    android:weightSum="10"
    android:gravity="center">

    <ImageView
         android:layout_width="0dip"
        android:layout_weight="3"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher"
        android:id="@+id/imageView3" />
</LinearLayout>

</LinearLayout>
于 2015-08-17T13:00:43.743 に答える