it-swarm.com.ru

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

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

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

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

20
wolverine

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

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

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

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

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

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

17
Ghost

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

                  ldpi     mdpi     hdpi     xhdpi     xxhdpi     xxxhdpi
ic_launcher      36x36    48x48    72x72     96x96     144x144    192x192
Notification     18x18    24x24    36x36     48x48     72x72       96x96 
Action Bar & Tab 24*24    32*32    48*48     64*64     96*96      128*128
Background      240x320  320x480  480x800   720x1280   1080x1920  1440X2560

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

Макет:

layout-large-mdpi   (1024x600)
layout-large-tvdpi  (800x1280)
layout-large-xhdpi  (1200x1920)
layout-xlarge-mdpi  (1280x800)
layout-xlarge-xhdpi (2560x1600)

        res/layout/activity_main.xml # For handsets (smaller than 600dp available width)
        res/layout-sw600dp/activity_main.xml # For 7 inches tablets (600dp wide and bigger)
        res/layout-sw720dp/activity_main.xml # For 10 inches tablets (720dp wide and bigger)

OR
res/layout/layout #this is the default
res/layout/layout-large  #for 7 inches tablet and images from res/drawable-mdpi/xyz.png
res/layout/layout-xlarge  #for 10 inches tablet

Ссылки по ссылке:

Поддержка разных разрешений Android

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

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

Есть ли список разрешений экрана для всех телефонов и планшетов на базе Android?

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

Самые популярные размеры экрана/разрешения на телефонах Android

28
Sanjay Mangaroliya

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

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

Problem возникает, когда мы устанавливаем Views/Layouts с некоторым постоянным значением width или height, скажем, 100dp.

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

<?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/height макета фиксированного размера, потому что в 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 должны серьезно подумать о замене единиц dp/dip на percentage.

9
Muhammad Babar

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

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

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

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

https://github.com/intuit/sdp

1
Kamil Ibadov

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' }
0
Unknown