Как настроить 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 для текстов.
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).
Может попробовать это, это поможет мне, может быть, и надежда поможет вам.