web-dev-qa-db-ja.com

すべての画面サイズをサポートするためにAndroidレイアウトを設定するには?

私はAndroid version2.2でプログラムを開発しています。複数の画面サイズのサポートに関する多くのドキュメントを読みましたが、それでも混乱しています。大画面と通常画面をサポートするレイアウトファイルを小さな画面で試してみると、画面に合わせてレイアウトが調整されているわけではないので、マニフェストでもこのコードを使用しました。

<supports-screens 
        Android:resizeable="true"
        Android:smallScreens="true"
        Android:normalScreens="true"
        Android:largeScreens="true"
        Android:anyDensity="true"
        />

小さな画面の画像は here。 小さな画面と互換性のある画面を設定するにはどうすればよいですか? 「layout-small」フォルダを使用して見つけた場所がありますが、これを使用すると、プロジェクトのサイズが大きくなります。それは望ましくありません。だから、これを行う最善の方法を提案できますか?

21
wolverine

以下のリンクをご覧ください。これらはあなたを助けるかもしれません:

異なる画面サイズのサポート

複数画面のサポート

異なる密度のサポート

タブレットおよびハンドセットのサポート

私の知る限り、すべての画面をサポートする唯一の方法は、そのフォルダーの分岐を行うことです。すべてのXMLファイルは数キロバイトになります。そのため、サイズはそれほど大きな問題ではありません。

18
Ghost

すべての画面に対応し、すべてのレイアウトをサポートします。

アイコン:

                                 mdpi        hdpi       xhdpi       xxhdpi       xxxhdpi  
Launcher Icons (App Icons)      48 x 48     72 x 72    96 x 96     144 x 144    192 x 192
Action Bar,Toolbar,Tab Icons    24 x 24     36 x 36    48 x 48      72 x 72      96 x 96 
Notification Icons              24 x 24     36 x 36    48 x 48      72 x 72      96 x 96 

背景画像の解像度:

ldpi:    Portrait: 240 X 320px.      Landscape: 320 X 240px.
mdpi:    Portrait: 320 X 480px.      Landscape: 480 X 320px.
hdpi:    Portrait: 480 X 800px.      Landscape: 800 X 480px.
xhdpi:   Portrait: 640 X 960px.      Landscape: 960 X 640px.
xxhdpi:  Portrait: 960 X 1600px.     Landscape: 1600 X 960px.
xxxhdpi: Portrait: 1280 X 1920px.    Landscape: 1920 X 1280px.  

Drawable Folder:

res/drawable        (default)
res/drawable-ldpi/  (240x320 and nearer resolution)
res/drawable-mdpi/  (320x480 and nearer resolution)
res/drawable-hdpi/  (480x800, 540x960 and nearer resolution)
res/drawable-xhdpi/  (720x1280 - Samsung S3, Micromax Canvas HD etc)
res/drawable-xxhdpi/ (1080x1920 - Samsung S4, HTC one, Nexus 5, etc)
res/drawable-xxxhdpi/ (1440X2560 - Nexus 6,Samsung S6Edge).


ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi

レイアウト:

Portrait: 
res/layout/main_activity.xml           # For handsets (smaller than 600dp available width)
res/layout-large/main_activity.xml     # For small tablets (640dp x 480dp and bigger)
res/layout-xlarge/main_activity.xml    # For large tablets (960dp x 720dp and bigger)
res/layout-w600dp/main_activity.xml    # For 7” tablets or any screen with 600dp
                                       # available width (possibly landscape handsets)

Landscape:
res/layout-land/main_activity.xml           # For handsets in landscape
res/layout-sw600dp-land/main_activity.xml   # For 7” tablets in landscape

参照リンク:

異なる解像度のサポートAndroid

https://developer.Android.com/guide/practices/screens_support.html

https://design.google.com/devices/

すべての画面解像度のリストはありますAndroidベースの携帯電話とタブレット?

http://www.emirweb.com/ScreenDeviceStatistics.php

Android携帯電話 で最も人気のある画面サイズ/解像度

33

はい、私はcureをあなたの問題に持っています、あなたは正しいです、すべての画面解像度のレイアウトを作成するのは時間がかかり、プロジェクトのサイズが大きくなると個人的に思います。

すべての画面解像度に適合するレイアウトを作成するために、私は独自の手法を実装しました-パーセンテージでwidthおよびheightを設定します

問題は、Views/Layoutsに一定の定数widthまたはheightを設定すると、100dpと言えます。

解決策は、ビューが空のスペースを埋めるようにmatch_parentを使用するか、weightを使用して他のViewに関連するすべてのViewsを定義するのは非常に簡単ですほぼすべての画面解像度で見栄えがよく、実行時に一定の定数を持つViews/LayoutsのみのLayoutParamsを設定するレイアウトまたは高さに関してパーセント

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <LinearLayout
        Android:id="@+id/mLayout"
        Android:layout_width="280px"
        Android:layout_height="300px" />


</RelativeLayout>

注意:使用済みpx固定サイズのレイアウトwidth/heightLayoutParams layoutParams = new LayoutParams(int width, int height);ではwidthおよびheight値をpixelsとして取ります

ここにコード例があります

final ViewTreeObserver mLayoutObserver = mLayout.getViewTreeObserver();

    mLayoutObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
    {

        @Override
        public void onGlobalLayout() 
        {
            DisplayMetrics metrics = getResources().getDisplayMetrics();

            int deviceWidth = metrics.widthPixels;

            int deviceHeight = metrics.heightPixels;

            float widthInPercentage =  ( (float) 280 / 320 )  * 100; // 280 is the width of my LinearLayout and 320 is device screen width as i know my current device resolution are 320 x 480 so i'm calculating how much space (in percentage my layout is covering so that it should cover same area (in percentage) on any other device having different resolution

            float heightInPercentage =  ( (float) 300 / 480 ) * 100; // same procedure 300 is the height of the LinearLayout and i'm converting it into percentage

            int mLayoutWidth = (int) ( (widthInPercentage * deviceWidth) / 100 );

            int mLayoutHeight = (int) ( (heightInPercentage * deviceHeight) / 100 );

            LayoutParams layoutParams = new LayoutParams(mLayoutWidth, mLayoutHeight);

            mLayout.setLayoutParams(layoutParams);
        }
    });

誰かがすぐに尋ねることができる助けがまだ必要な場合、コードはほとんど自明です

結論:何らかの定数を設定する必要がある場合幅/高さViews/Layoutsに対して常に値を設定しますpxレイアウトファイル(つまりxml)プログラムでLayoutParamsを設定します。

提案:思うGoogle Android Guysdp/dipユニットをpercentageに置き換えることを真剣に考えるべきです。

9
Muhammad Babar

さまざまな画面サイズをサポートするのがより簡単になりました!新しいサイズの単位[〜#〜] sdp [〜#〜]を使用します。

[〜#〜] sdp [〜#〜]-スケーラブルなサイズの単位

新しいサイズの単位を提供するAndroid SDK-sdp(スケーラブルdp)。このサイズ単位は、画面サイズに合わせて調整されます。 Android開発者が複数の画面をサポートするのに役立ちます。

テキストビューについては、テキストのspサイズの単位に基づく ssp を参照してください。

https://github.com/intuit/sdp

3
Kamil Ibadov

スケーラブルDP(sdp)は、使用に最適なソリューションです。画面サイズに応じてウィジェットのサイズを変更します。さまざまなテキストサイズのテキストにこれを適用することもできます。

プロジェクトにsdpを追加するには(Android Studio and Gradleを使用):

build.gradle依存関係ブロックに実装 'com.intuit.sdp:sdp-Android:1.0.5'を追加します。

for example:
dependencies {'com.intuit.sdp:sdp-Android:1.0.5' }
1
Unknown

これを試して

<Android.support.constraint.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent">

<ImageView
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    app:layout_constraintDimensionRatio="1:1"
    Android:scaleType="fitXY"
    Android:adjustViewBounds="true"
    Android:src="@drawable/myimage"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"/>
0
DEVSHK