Как настроить макет Android для поддержки всех размеров экрана? - программирование
Подтвердить что ты не робот

Как настроить макет Android для поддержки всех размеров экрана?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Иконки:

                                 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 Папка:

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

Ответ 3

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

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

Проблема возникает, когда мы устанавливаем Views/Layouts с некоторым значением константы width или height, чтобы сказать 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);
        }
    });

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

Заключение: Если вам нужно установить константу width/height для вашего Views/Layouts всегда заданного значения в px в файле макета ( т.е. xml), а затем программно установить LayoutParams.

Предложение: Я думаю, что Google Android Guys должен серьезно подумать о замене единиц dp/dip на percentage.

Ответ 4

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

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

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

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

https://github.com/intuit/sdp

Ответ 5

Scalable 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' }

Ответ 6

Попробуй это

<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"/>

Ответ 7

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

Я решил эту проблему, разделив экран с помощью 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).

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

Ответ 8

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