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

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

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

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

7 ответов

Решение

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

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

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

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

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

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

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

                  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

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

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

Проблема возникает, когда мы устанавливаем 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,

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

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

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

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

https://github.com/intuit/sdp

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

Try this one

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

Попробуйте, эта библиотека потрясающая

implementation 'com.intuit.ssp:ssp-android:1.0.6'

пример

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Sign up"
        android:textSize="@dimen/_16ssp" />

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

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

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

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

Другие вопросы по тегам