Wie definiere ich dimension.xml für jede unterschiedliche Bildschirmgröße in Android?

128

Bei der Unterstützung unterschiedlicher Bildschirmgrößen (-dichten) in Android liegt der Schwerpunkt häufig auf der Erstellung unterschiedlicher Layouts für jeden möglichen Bildschirm. IE

  • ldpi
  • mdpi
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

Ich habe ein Layout für einen xhdpi- Bildschirm als Referenz entworfen und dessen Abmessungen in dimension.xml definiert . Jetzt möchte ich jede mögliche Bildschirmgröße unterstützen. Wie kann ich das machen?

Soweit ich weiß, kann ich mit diesem Tool die richtige dimension.xml für andere Bildschirmgrößen ermitteln und meinem Projekt hinzufügen. Ist das in meiner Situation der richtige Weg?

Eine andere Frage: Muss ich nur die Datei dimension.xml für die obigen Bildschirmabmessungen erstellen ? Wenn ja, was dann w820dp?

Danke für Ihre Hilfe. Ich muss nur Telefone unterstützen (keine Tablets oder andere Geräte).

Amit Pal
quelle
1
Ja, Sie müssen unterschiedliche dimesn.xmlDateien für unterschiedliche Auflösungen erstellen .
Piyush
@PiyushGupta Das wird für alle oben dimensionalen Bildschirm? Aber was W820dpunterstützt eine andere Android-Version? Können Sie mir auch ein Tutorial zur Unterstützung verschiedener Bildschirme auf der Basis von dimension.xml vorschlagen?
Amit Pal
Es ist für Tablets oder für andere. Andernfalls müssen Sie, wie gesagt, einen anderen Werteordner erstellen.
Piyush

Antworten:

266

Sie müssen einen Ordner mit unterschiedlichen Werten für verschiedene Bildschirme erstellen . Mögen

values-sw720dp          10.1 tablet 1280x800 mdpi

values-sw600dp          7.0  tablet 1024x600 mdpi

values-sw480dp          5.4  480x854 mdpi 
values-sw480dp          5.1  480x800 mdpi 

values-xxhdpi           5.5"  1080x1920 xxhdpi
values-xxxhdpi           5.5" 1440x2560 xxxhdpi

values-xhdpi            4.7   1280x720 xhdpi 
values-xhdpi            4.65  720x1280 xhdpi 

values-hdpi             4.0 480x800 hdpi
values-hdpi             3.7 480x854 hdpi

values-mdpi             3.2 320x480 mdpi

values-ldpi             3.4 240x432 ldpi
values-ldpi             3.3 240x400 ldpi
values-ldpi             2.7 240x320 ldpi

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen finden Sie hier

Verschiedene Werteordner in Android

http://android-developers.blogspot.in/2011/07/new-tools-for-managing-screen-sizes.html

Bearbeitet von @humblerookie

Sie können das Android Studio-Plugin Dimenify verwenden, um automatisch Bemaßungswerte für andere Pixel-Buckets basierend auf benutzerdefinierten Skalierungsfaktoren zu generieren. Es befindet sich noch in der Beta-Phase. Informieren Sie den Entwickler über alle Probleme / Vorschläge, auf die Sie stoßen.

IntelliJ Amiya
quelle
1
sollte es nicht "values-sw480dp-hdpi" .xhdpi und xxhdpi und so weiter geben? Nur 320dp haben solche in Ihrer Antwort. Bitte antworten Sie
Sharp Edge
2
@IntelliJAmiya: Sie sollten den Unterschied zwischen Android <= 3.2 und> 3.2 erwähnen.
Jürgen d
5
@IntelliJAmiya Ich habe ein Studio-Plugin namens Dimenify erstellt. Auf diese Weise können Sie problemlos Abmessungen für andere Eimer erstellen. Könnten Sie eine Bearbeitung mit derselben hinzufügen, damit andere davon Gebrauch machen können? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie
3
Dieses Dimenify ist ein großartiges Werkzeug
Muhammed Refaat
1
@IntelliJAmiya sicher, es wird neue Versionen geben, die in diesen Ordnern nicht behandelt werden und / oder in bestimmten Ordnern möglicherweise nicht geeignet sind.
Ralphgabb
35

Verwenden Sie Scalable DP

Obwohl es theoretisch eine gute Idee ist, ein anderes Layout für verschiedene Bildschirmgrößen zu erstellen, kann es sehr schwierig werden, alle Bildschirmabmessungen und Pixeldichten zu berücksichtigen. Es dimens.xmlist überhaupt nicht einfach, über 20 verschiedene Dateien zu haben, wie in den obigen Antworten vorgeschlagen.

Wie benutzt man:

Verwendung sdp:

  1. Nehmen Sie implementation 'com.intuit.sdp:sdp-android:1.0.5'in Ihre build.gradle,
  2. Ersetzen Sie einen dpWert wie z. B. 50dpdurch einen @dimen/50_sdpähnlichen Wert :

    <TextView
     android:layout_width="@dimen/_50sdp"
     android:layout_height="@dimen/_50sdp"
     android:text="Hello World!" />
    

Wie es funktioniert:

sdpskaliert mit der Bildschirmgröße, da es sich im Wesentlichen um eine riesige Liste von Unterschieden dimens.xmlfür jeden möglichen dpWert handelt.

Geben Sie hier die Bildbeschreibung ein

Sehen Sie es in Aktion:

Hier handelt es sich um drei Geräte mit sehr unterschiedlichen Bildschirmabmessungen und -dichten:

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass die sdpBerechnung der Größeneinheit aufgrund einiger Leistungs- und Verwendbarkeitsbeschränkungen eine gewisse Annäherung enthält.

Advait S.
quelle
Herzlichen Dank. Das war wirklich nützlich für mich.
Twenk11k
@Advait Kannst du mir bitte sagen, welchen Werteordner ich für Samsung Edge 7 mit 5,5-Zoll-Handy mit einer Auflösung von 2560 x 1440 verwenden soll?
ULHAS PATIL
@Advait Derzeit verwende ich den Ordner values-xxhdpi, aber das Problem ist, dass derselbe Ordner für 5, 5.5 und 6 Bildschirme denselben Ordner verwendet, sodass auf 5-Zoll-Bildschirmen und 5.5 ein Bildlauf angezeigt wird. Das will ich nicht Kannst du mir bitte dabei helfen?
ULHAS PATIL
@Advait S Werte-xxhdpi für 5,5 "1080x1920 & auch für 5,5" 1440x2560 Ich möchte einen anderen Ordner für 5,5 "1440x2560.
ULHAS PATIL
@ULHASPATIL genau! Ich bin auf ein ähnliches Problem gestoßen und verstehe nicht, wie ich es lösen soll. Haben Sie eine Lösung für Bildschirme mit ähnlichen Zoll und unterschiedlicher Pixelauflösung gefunden?
Georgiy Chebotarev
27

Wir möchten die Änderungen der erforderlichen Ansichtsgröße in verschiedenen Bildschirmen sehen.

Wir müssen unterschiedliche Werteordner für unterschiedliche Bildschirme erstellen und die Datei dimension.xml basierend auf der Bildschirmdichte ablegen.

Ich habe eine Textansicht genommen und die Änderungen beobachtet, als ich dimension.xml in verschiedenen Werteordnern geändert habe.

Bitte folgen Sie dem Prozess

normal - xhdpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die normale - xhdpi \ dimension.xml ändern

Nexus 5X (5,2 "* 1080 * 1920: 420 dpi)

Nexus 6P (5,7 "* 1440 * 2560: 560 dpi)

Nexus 6 (6,0 "* 1440 * 2560: 560 dpi)

Nexus 5 (5,0 ", 1080 1920: xxhdpi)

Nexus 4 (4,7 ", 768 * 1280: xhdpi)

Galaxy Nexus (4,7 ", 720 * 1280: xhdpi)

4,65 "720p (720 * 1280: xhdpi)

4,7 "WXGA (1280 * 720: Xhdpi)

Xlarge - xhdpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die Xlarge - xhdpi \ dimension.xml ändern

Nexus 9 (8,9 ", 2048 * 1556: xhdpi)

Nexus 10 (10,1 ", 2560 * 1600: xhdpi)

groß - xhdpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die große xhdpi \ dimension.xml ändern

Nexus 7 (7,0 ", 1200 * 1920: xhdpi)

Nexus 7 (2012) (7,0 ", 800 * 1280: tvdpi)

Die folgenden Bildschirme werden unter "Generische Telefone und Tablets suchen" angezeigt.

groß - mdpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die Größe - mdpi \ dimension.xml ändern

5,1 "WVGA (480 * 800: mdpi)

5,4 "FWVGA (480 * 854: mdpi)

7,0 "WSVGA (Tablette) (1024 * 600: mdpi)

normal - hdpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die normale Datei - hdpi \ dimension.xml - ändern

Nexus s (4,0 ", 480 * 800: hdpi)

Nexus eins (3,7 ", 480 * 800: hdpi)

small - ldpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die Datei small - ldpi \ dimension.xml ändern

2,7 "QVGA Slider (240 * 320: ldpi)

2,7 "QVGA (240 * 320: ldpi)

xlarge - mdpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die Datei xlarge - mdpi \ dimension.xml ändern

10,1 "WXGA (TABLETTE) (1280 * 800: MDPI)

normal - ldpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die normale - ldpi \ dimension.xml ändern

3,3 "WQVGA (240 * 400: LDPI)

3,4 "WQVGA (240 * 432: LDPI)

normal - hdpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die normale Datei - hdpi \ dimension.xml - ändern

4,0 "WVGA (480 * 800: hdpi)

3,7 "WVGA (480 * 800: hdpi)

3,7 "FWVGA-Schieberegler (480 * 854: HDPI)

normal - mdpi \ dimension.xml

Die folgenden Geräte können die Größe von Bildschirmen ändern, wenn wir die normale Datei - mdpi \ dimension.xml - ändern

3,2 "HVGA Slider (ADP1) (320 * 480: MDPI)

3,2 "QVGA (ADP2) (320 * 480: MDPI)

koteswarao
quelle
Also würden die Ordner Ihrer Meinung nach so etwas heißen values-normal-xhdpi?
VonSchnauzer
Ja, ich stimme Ihnen zu, anstatt Werte in alle Dateien zu schreiben, sagte ich: "Erstellen Sie unterschiedliche Werteordner für unterschiedliche Textgrößen." Bitte lesen Sie den Titel. Vielen Dank.
Koteswarao
9

Es gibt nette Bibliotheken, die alles handhaben und Ihre Schmerzen lindern. Fügen Sie zur Verwendung einfach zwei Abhängigkeiten in gradle hinzu:

 implementation 'com.intuit.ssp:ssp-android:1.0.5'
 implementation 'com.intuit.sdp:sdp-android:1.0.5'

Verwenden Sie danach dimensFolgendes:

        android:layout_marginTop="@dimen/_80sdp"
Shivam Yadav
quelle
3
Hier sind die Bibliotheken als Referenz: SDP und SSP . Und danke für diese genaue Antwort!
JorgeAmVF
7

Ich habe ein einfaches Java-Programm hochgeladen, das Ihren Projektspeicherort und die gewünschte Dimensionsdatei als Eingabe verwendet. Auf dieser Grundlage würde die entsprechende Dimensionsdatei in der Konsole ausgegeben. Hier ist der Link dazu:

https://github.com/akeshwar/Dimens-for-different-screens-in-Android/blob/master/Main.java

Hier ist der vollständige Code für die Referenz:

public class Main {


    /**
     * You can change your factors here. The current factors are in accordance with the official documentation.
     */
    private static final double LDPI_FACTOR = 0.375;
    private static final double MDPI_FACTOR = 0.5;
    private static final double HDPI_FACTOR = 0.75;
    private static final double XHDPI_FACTOR = 1.0;
    private static final double XXHDPI_FACTOR = 1.5;
    private static final double XXXHDPI_FACTOR = 2.0;

    private static double factor;

    public static void main(String[] args) throws IOException {


        Scanner in = new Scanner(System.in);
        System.out.println("Enter the location of the project/module");
        String projectPath = in.nextLine();

        System.out.println("Which of the following dimension file do you want?\n1. ldpi \n2. mdpi \n3. hdpi \n4. xhdpi \n5. xxhdpi \n6. xxxhdpi");

        int dimenType = in.nextInt();

        switch (dimenType) {
            case 1: factor = LDPI_FACTOR;
                break;
            case 2: factor = MDPI_FACTOR;
                break;
            case 3: factor = HDPI_FACTOR;
                break;
            case 4: factor = XHDPI_FACTOR;
                break;
            case 5: factor = XXHDPI_FACTOR;
                break;
            case 6: factor = XXXHDPI_FACTOR;
                break;
            default:
                factor = 1.0;
        }

        //full path = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/src/main/res/values/dimens.xml"
        //location of the project or module = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/"


        /**
         * In case there is some I/O exception with the file, you can directly copy-paste the full path to the file here:
         */
        String fullPath = projectPath + "/src/main/res/values/dimens.xml";

        FileInputStream fstream = new FileInputStream(fullPath);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

        String strLine;

        while ((strLine = br.readLine()) != null)   {
            modifyLine(strLine);
        }
        br.close();

    }

    private static void modifyLine(String line) {

        /**
         * Well, this is how I'm detecting if the line has some dimension value or not.
         */
        if(line.contains("p</")) {
            int endIndex = line.indexOf("p</");

            //since indexOf returns the first instance of the occurring string. And, the actual dimension would follow after the first ">" in the screen
            int begIndex = line.indexOf(">");

            String prefix = line.substring(0, begIndex+1);
            String root = line.substring(begIndex+1, endIndex-1);
            String suffix = line.substring(endIndex-1,line.length());


            /**
             * Now, we have the root. We can use it to create different dimensions. Root is simply the dimension number.
             */

            double dimens = Double.parseDouble(root);
            dimens = dimens*factor*1000;
            dimens = (double)((int)dimens);
            dimens = dimens/1000;
            root = dimens + "";

            System.out.println(prefix + " " +  root + " " + suffix );

        }

        System.out.println(line);
    }
}
Akeshwar Jha
quelle
6

Sie müssen einen anderen valuesOrdner für verschiedene Bildschirme erstellen und die dimens.xmlDatei entsprechend der Dichte ablegen.

1) values

2) values-hdpi (320x480 ,480x800)

3) values-large-hdpi (600x1024)

4) values-xlarge (720x1280 ,768x1280 ,800x1280 ,Nexus7 ,Nexus10)

5) values-sw480dp (5.1' WVGA screen)

6) values-xhdpi (Nexus4 , Galaxy Nexus)
Piyush
quelle
Woher bekomme ich die Ration zwischen den Bildschirmgrößen? Wie ich bereits in dem Werkzeug sehen definierten sie alles in ldpi, mdpiWeise
Amit Pal
Dies hängt von Ihrem Werteordner ab, der höchstens Werte abruft.
Piyush
Muss ich values-xxhdpifür Nexus 6 erwähnen ?
Amit Pal
Ja, das musst du sein!
Piyush
320x480ist typisch mdpi . Also, setzen Sie es entweder in valuesoder invalues-mdpi
Phantômaxx
6

Sie können setzen dimens.xmlin

1) Werte

2) Werte-hdpi

3) Werte-xhdpi

4) Werte-xxhdpi

Geben Sie dimens.xmlje nach Dichte unterschiedliche Größen in den entsprechenden Ordnern an.

Anoop M.
quelle
2
Laut Android-Dokumentation sind klein / normal / groß veraltet.
Benjamin Mesing
1

Falls Sie mehr sehen: Hier ist ein Link für eine Liste der Geräte (Tablet, Handy, Uhren), einschließlich watch, chromebook, windowsund mac. Hier finden Sie die Dichte, Abmessungen usw. Wenn Sie sie auch hier verwenden, ist dies eine gute Ressource, wenn Sie auch einen Emulator verwenden.

Wenn Sie auf ein bestimmtes Element klicken, werden auf der rechten Seite weitere Details angezeigt. Stichprobe

Da es ist Android, werde ich im Zusammenhang damit posten. sample1

sample2

~ Es ist besser, wenn Sie eine Kopie des Webs speichern. Um es offline anzuzeigen.

RoCk RoCk
quelle
1

Android 3.2 führt einen neuen Ansatz für Bildschirmgrößen ein. Die Zahlen, die die Bildschirmgröße beschreiben, sind alle in "dp" -Einheiten angegeben. Meistens können wir verwenden

kleinste Breite dp: die kleinste verfügbare Breite für das Anwendungslayout in „dp“ -Einheiten; Dies ist die kleinste Breite dp, die Sie jemals bei einer Drehung des Displays antreffen werden.

Um einen Rechtsklick zu erstellen, klicken Sie auf res >>> new >>> Android-Ressourcenverzeichnis

Von Verfügbare Qualifikations Fenster bewegen Kleinster Bildschirmbreite zu Chosen - Qualifikation

In Bildschirmbreite Fenster nur die „dp“ Wert schreiben von Ihnen beginnen würde Android Studio möchte , dass dimens zu verwenden.

Klicken Sie mit der rechten Maustaste auf das neu erstellte Ressourcenverzeichnis, um zur Projektansicht zu wechseln

neue >>> Werte Ressourcendatei Geben Sie einen neuen Dateinamen dimension.xml ein und Sie sind fertig.

Levon Petrosyan
quelle
Vielen Dank, dass Sie erklärt haben, wie diese Ordner tatsächlich erstellt werden.
Beko