Я пытаюсь использовать Java ( не XML ) для создания LinearLayout с кнопками, которые заполняют экран и имеют поля. Вот код, который работает без полей:
LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
Button btn = new Button(this);
btn.setText("A");
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
lp.weight = 1.0f; // This is critical. Doesn't work without it.
buttonsView.addView(btn, lp);
}
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);
Так что это прекрасно работает, но как же вы задаете поля кнопок, чтобы между ними было пространство? Я пытался использовать LinearLayout.MarginLayoutParams
, но это не имеет weight
члена, так что это не хорошо. И это не сработает, если вы передадите его lp
в конструктор.
Это невозможно? Потому что это выглядит так, и это будет не первая задача макета Android, которую вы можете выполнить только в XML.
Ответы:
Вот небольшой код для этого:
источник
Вы звоните
setMargins()
наLinearLayout.LayoutParams
объекте.LinearLayout.LayoutParams
является подклассомLinearLayout.MarginLayoutParams
, как указано в документации .Нет.
Вы можете предоставить доказательство этого требования.
Лично я ничего не знаю о том, что может быть достигнуто только с помощью XML, а не с помощью методов Java в SDK. Фактически, по определению, все должно быть выполнимо через Java (хотя не обязательно через методы, достигаемые SDK), поскольку XML не является исполняемым кодом. Но, если вы знаете что-то, укажите на это, потому что это ошибка в SDK, которая должна быть исправлена когда-нибудь.
источник
LayoutPararms
. Я с точки зрения стилей ... да, ну, есть причина, по которой я их не использую. :-)Чтобы добавить поля непосредственно к элементам (некоторые элементы допускают непосредственное редактирование полей), вы можете сделать:
... это работает без необходимости знать / редактировать окружающий макет. Обратите внимание на проверку «instanceof» на случай, если вы попытаетесь выполнить это для чего-то, что не поддерживает поля.
источник
Из-за различий в плотности пикселей экрана устройства хорошо всегда использовать
DIP
единицу для установки поля программно. Как нижеНадеюсь, это поможет.
источник
Я настроил поля напрямую, используя приведенный ниже код
Единственное, что здесь нужно отметить, это то, что
LayoutParams
следует импортировать следующий пакетandroid.widget.RelativeLayout.LayoutParams
, иначе произойдет ошибка.источник
Попробуй это
источник
источник
Попробуй это:
источник
вы должны знать тип viewGroup вида. Например, в приведенном выше коде я хочу изменить поле frameLayout, а группа представлений frameLayout - RelativeLayout,, поэтому вам необходимо преобразовать в (RelativeLayout.LayoutParams)
источник
Здесь в одной строке Решение:
источник