Программная установка параметров макета в Android v7.0 и Android 5.0

Фон

В моем приложении для Android я программно добавляю, удаляю элементы строк в таблице и управляю ими. Мне нужно установить параметры макета элементов в TableRow() для этих событий манипуляции с таблицей.

Проблема

После перехода с Android 5.0 на Android 7.0 и запуска приложения на другом планшете строки таблицы не отражают определенные параметры макета.

Чтобы уточнить:

Конфигурация 1:

  • Аппаратное обеспечение: Samsung Galaxy Tab4
  • Версия Android: 5.0.2
  • Результат: строка таблицы отформатирована правильно

Конфигурация 2

  • Аппаратное обеспечение: Samsung Galaxy Tab S2

  • Версия Android: 7.0

  • Результат: строка таблицы не отформатирована

Пример кода

//Define Layout Parameters
rowLayoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
tableLayoutParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
editTextLayoutParams = new TableRow.LayoutParams(100, 40);
tvLayoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);

//Create new table tow
tableRow = new TableRow(getActivity());
tableRow.setLayoutParams(rowLayoutParams);

//Define Margins
int etMargin1 = (int)getActivity().getResources().getDimension(R.dimen.etMargin1);
int etMargin2 = (int)getActivity().getResources().getDimension(R.dimen.etMargin2);

int tvMargin1 = (int)getActivity().getResources().getDimension(R.dimen.tvMargin1);
int tvMargin2 = (int)getActivity().getResources().getDimension(R.dimen.tvMargin2);


if(editable)
{
    //Create Edit Texts
    EditText exampleEt = new EditText(getActivity());
    editTextLayoutParams.setMargins(etMargin1,5,etMargin2,5);
    exampleEt.setLayoutParams(editTextLayoutParams);
    tableRow.setLayoutParams(rowLayoutParams);
    tableRow.addView(exampleEt);
}
else
{
    //Create Text Views
    TextView exampleTv = new TextView(getActivity());

    //Set Layout Params
    tvLayoutParams.setMargins(tvMargin1,5,tvMargin2,5);
    exampleTv.setLayoutParams(tvLayoutParams);

    tableRow.setLayoutParams(rowLayoutParams);
    tableRow.addView(exampleTv);
}

Дополнительная спецификация

Обратите внимание на то, что в примере кода редактирование текста отличается от текстовых представлений. Только элементы Edit Text не форматируются должным образом. Формат полей текстового представления соответствует ожидаемому.


person Nick Schrock    schedule 18.08.2017    source источник


Ответы (1)


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

Часть 1 заключалась в том, чтобы определить параметры ширины и высоты макета строки с точки зрения пикселей, не зависящих от плотности, а не жестко запрограммированных значений.

int etHeight = (int)getActivity().getResources().getDimension(R.dimen.etHeight);
int etWidth = (int)getActivity().getResources().getDimension(R.dimen.etWidth);

editTextLayoutParams = new TableRow.LayoutParams(etWidth, etHeight);

где в dimens.xml

<dimen name="etHeight">40dp</dimen>
<dimen name="etWidth">100dp</dimen>

Часть 2 заключалась в изменении размера ширины таблицы, на который ссылается определение таблицы xml в файле макета. Поля на самом деле были отформатированы правильно, но таблица была слишком велика для экрана и создавала иллюзию, что элементы были упакованы в левую часть таблицы.

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

person Nick Schrock    schedule 18.08.2017