Я создал BaseAdapter, который реализует ListAdapter. Этот BaseAdapter читает файл JSON и заполняет мой ListView, создавая настраиваемый макет.

В этом файле JSON у меня есть логическое значение (active = true или active = false). Если active - true, я раздуваю настраиваемый макет, и все в порядке, но если active - false, мне нужно создать новый View в этом настраиваемом макете. Вот мой код:

if (!active) {
    JSONObject notifications = jsonData.getJSONObject("notifications");
    String message = notifications.getString("message");

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    params.height = 70;

    TextView warning = new TextView(Controller.getContext());
    warning.setText(message);
    warning.setTextColor(Color.WHITE);
    warning.setBackgroundColor(Color.RED);
    warning.setGravity(Gravity.CENTER);
    warning.setPadding(10, 0, 10, 0);
    warning.setLayoutParams(params);

    // contentFrame is a RelativeLayout where the view is created;
    viewHolder.contentFrame.getLayoutParams().height = 320;
    viewHolder.contentFrame.addView(warning);
 }

Моя проблема вот в чем:

params.height = 70;
viewHolder.contentFrame.getLayoutParams().height = 320;

Я говорю, что мой TextView на 70 пикселей выше, а мой RelativeLayout теперь имеет высоту 320 пикселей.

На моем телефоне это выглядит хорошо, но если я тестирую на телефоне с другим разрешением, оно будет выглядеть иначе, верно?

Есть ли способ создать вид и определить высоту или ширину в соответствии с разрешением экрана? Может быть, создать View 10% от размера разрешения экрана? Это хорошая практика? Как лучше всего подходить к подобному?

0
Ravers 14 Апр 2016 в 00:01

3 ответа

Лучший ответ

Вы должны масштабировать значения размера в соответствии с плотностью экрана:

float density = getResources().getDisplayMetrics().density;

Это означает, что вам нужно умножить все значения размера на density:

params.height = (int)(70 * density);
viewHolder.contentFrame.getLayoutParams().height = (int)(320 * density);

И то же самое со значениями заполнения:

warning.setPadding((int)(10 * density), 0, (int)(10 * density), 0);
1
Floern 13 Апр 2016 в 21:10

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

Дополнительную информацию см. В this.

Итак, определите это в своем файле sizes.xml:

<resources>
    <dimen name="my_width">320dp</dimen>
</resources>

Тогда прочитайте это так:

int width =  getResources().getDimensionPixelSize(R.dimen.my_width);
2
Francesc 13 Апр 2016 в 21:06

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

Итак, у вас есть два определения: одно для «нормальных» обстоятельств, а другое для «большого экрана»:

src/main/res/values/dimens.xml
src/main/res/values-sw600dp/dimens.xml

Каждый файл ресурсов может иметь одно и то же измерение, определенное в dp. Android выберет подходящий. Если вам нужно программно считывать значения как необработанные размеры пикселей, вы можете сделать это с помощью Resources.getDimensionPixelSize ().

Я бы не рекомендовал пытаться определять элементы списка в процентах от размера экрана.

1
Doug Stevenson 13 Апр 2016 в 21:16