Пояснение:
Вы скрыли свою проблему с ?
.
Операторы, состоящие из ?
, должны использоваться с осторожностью.
Оператор as?
var params = textView.layoutParams as? LinearLayout.LayoutParams
as?
вернет null
, если textView.layoutParams
вернет null
.
После этого вызова ваша params
переменная равна null
.
Оператор ?.
params?.setMargins(48,10,48,10)
Это равно:
if (params != null) {
params.setMargins(48, 10, 48, 10)
}
В вашем случае params==null
, поэтому ничего не выполняется.
setLayoutParams
вызов (с использованием синтаксиса свойства)
Метод setLayoutParams
требует, чтобы вы передавали non-null
LayoutParams
аргумент. От документов :
ViewGroup.LayoutParams
: параметры макета для этого вида, не может быть нулевым
Вот почему, когда вы передаете params==null
ваше приложение падает.
Почему textView.layoutParams
возвращает null
Из документов :
LayoutParams
, связанный с этим представлением, или ноль, если параметры еще не установлены
Вы звоните textView.layoutParams
для View
, который был создан вручную (не через xml
макет), с:
val textView = TextView(activity)
В поле
layoutParams
указано, как конкретный view
присоединяется к вмещающему макету . Таким образом, если вы создали View
программно и не прикрепили его к каким-либо ViewGroup
(например, FrameLayout
, LinearLayout
, ConstraintLayout
и т. Д.), getLayoutParams
вернет null
, поскольку нет вмещающего макета для вашего View
.
Как это исправить?
Либо добавьте программно созданный View
к ViewGroup
, используя (один из) addView
метод (ов), либо создайте View
в макете XML-файл и поместите его в ViewGroup
там.