2016-04-13 4 views
0

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

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

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 pixeis.

Он хорошо выглядит на моем телефоне, но если я проведу проверку на телефоне с другим разрешением, он не будет выглядеть так же верно?

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

ответ

1

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

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); 
2

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

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

Таким образом, определить это в dimens.xml:

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

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

int width = getResources().getDimensionPixelSize(R.dimen.my_width); 
1

Вы можете определить размеры в XML like any other resource, и есть те ресурсы, автоматически Android на основе текущей конфигурации устройства.

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

файла
src/main/res/values/dimens.xml 
src/main/res/values-sw600dp/dimens.xml 

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

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

Смежные вопросы