Как настроить макет Android для поддержки всех размеров экрана? - PullRequest
21 голосов
/ 28 февраля 2012

Я занимаюсь разработкой программы для Android версии 2.2. Я прочитал много документации о поддержке нескольких размеров экрана, но все еще не уверен. Я разработал файл макета, который поддерживает большие и нормальные экраны, когда я пробую его на маленьком экране, он не подстраивает макет под экран. Я использовал этот код также в манифесте.

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

Изображение для маленького экрана здесь . Как я могу установить экран, который совместим с маленьким экраном? Где-то я обнаружил, используя папку «layout-small», но если я использую это, размер проекта увеличивается, я не хочу этого, поэтому кто-нибудь может предложить мне лучший способ сделать это?

Ответы [ 8 ]

33 голосов
/ 19 марта 2015

Решение для всех экранов и поддержка всех макетов.

Иконки:

                                 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.  

Папка для рисования:

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

18 голосов
/ 28 февраля 2012

Пожалуйста, перейдите по следующим ссылкам.Они могут помочь вам:

Поддержка разных размеров экрана

Поддержка нескольких экранов

Поддержка разных плотностей

Поддержка планшетов и трубок

AFAIK, единственный способ поддержать все экраны - выполнить раздвоение этой папки.Каждый XML-файл занимает до нескольких килобайт.Таким образом, размер не должен быть слишком большой проблемой как таковой.

9 голосов
/ 13 мая 2013

Да, у меня есть лекарство для вашей проблемы, вы правы, я лично считаю, что создание макетов для каждого разрешения экрана - это время и увеличение размера вашего проекта.

сделать макет, который подходит для всех разрешений экрана, я реализовал свою собственную технику, то есть настройки ширина и высота в процентах

Проблема происходит, когда мы устанавливаем Views/Layouts с некоторой константой ширина или высота значение, скажем 100dp.

Решение довольно просто попытатьсяиспользуйте match_parent, чтобы представление заполняло пустое пространство, или используйте weight и определяйте каждые View относительно других Views, это поможет вашему макету хорошо выглядеть практически на всех разрешениях экрана и во время выполнения, установленном LayoutParamsтолько из тех Views/Layouts, которые имеют некоторую постоянную ширину или высоту в терминах Процент .

<?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 для макетов фиксированного размера ширина / высота , поскольку в LayoutParams layoutParams = new LayoutParams(int width, int height); width и height принимают значение как пикселей

Вот пример кода

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 должны серьезно подумать о замене единиц dp/dip на percentage.

1 голос
/ 11 июля 2018

Масштабируемый DP (sdp) - лучшее решение для использования. Размер виджетов будет изменяться в зависимости от размера экрана Мы также можем применить это для текста для разных размеров текста.

Чтобы добавить sdp в ваш проект (с помощью Android Studio и Gradle):

добавить реализацию ' com.intuit.sdp: sdp-android: 1.0.5 ' в ваш блок зависимостей build.gradle.

for example:
dependencies {'com.intuit.sdp:sdp-android:1.0.5' }
1 голос
/ 16 января 2017

Теперь поддерживать другой размер экрана стало проще! Использовать новую единицу размера SDP .

SDP - единица масштабируемого размера

Android SDK, который предоставляет новый размер блока - sdp (масштабируемый дп). Эта единица измерения размера зависит от размера экрана. Это может помочь разработчикам Android с поддержкой нескольких экранов.

для просмотра текста, пожалуйста, обратитесь к ssp , который основан на единице размера sp для текстов.

https://github.com/intuit/sdp

0 голосов
/ 27 марта 2019

попробуйте это

<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 голосов
/ 23 марта 2017

Попробуйте использовать layout_weight, они помогут.:)

0 голосов
/ 28 февраля 2017

Я не уверен, что решение, но я хочу поделиться с вами, будет работать везде, оно охватывает большую часть области.

Я решил эту проблему, разделив экран с помощью LinearLayout и определив его ориентацию (горизонтальную или вертикальную), layout_weightsum = 3 (3 - разделить экран на 3 части).

Затем внутри этого корневого линейного макета я снова беру LinearLayout с layout_height = "0dp" (если вы хотите вертикальное разделение только в противном случае layout_height = "wrap_content", а если вам нужно горизонтальное, то сделайте layout_width = "0dp" и layout_weight =1 (1 для 1 часть экрана вы также можете поместить значение в float как 1.2).

Может попробовать это, это поможет мне, может быть, и надежда поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...