Да, у меня есть лекарство для вашей проблемы, вы правы, я лично считаю, что создание макетов для каждого разрешения экрана - это время и увеличение размера вашего проекта.
сделать макет, который подходит для всех разрешений экрана, я реализовал свою собственную технику, то есть настройки ширина и высота в процентах
Проблема происходит, когда мы устанавливаем 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
.