Установка полей в textView для фрагмента в kotlin - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь создать поля TextVIew в kotlin внутри фрагмента. По какой-то причине параметры равны нулю, и программа падает, когда фрагмент выполняется.

Печать самого текста работает, просто когда я пытаюсь создать поля, это не сработает. Я попытался установить безопасные проверки на пустые значения, чтобы разрешить нулевые значения, но в конечном итоге завершился исключением нуля.

val textView = TextView(activity)
textView.text = "Overall Rating: $overall_rating\n$comments  \n" +
    " Will live again: $willLiveAgain\nTimestamp: ${timestamp.toDate()}\n"

var params = textView.layoutParams as? LinearLayout.LayoutParams
params?.setMargins(48,10,48,10)
textView.id=1
textView.layoutParams = params  //nullpointer exception

2019-07-08 23: 50: 26.021 2332-2332 / com.example.cribb E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: главная Процесс: com.example.cribb, PID: 2332 java.lang.NullPointerException: параметры макета не могут быть нулевыми на android.view.View.setLayoutParams (View.java:16088) в com.example.cribb.DisplayListingFragment $ showReviews $ 1.onSuccess (DisplayListingFragment.kt: 95) в com.example.cribb.DisplayListingFragment $ showReviews $ 1.onSuccess (DisplayListingFragment.kt: 32) на com.google.android.gms.tasks.zzn.run (неизвестный источник: 4) на android.os.Handler.handleCallback (Handler.java:873) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:193) на android.app.ActivityThread.main (ActivityThread.java:6669) в java.lang.reflect.Method.invoke (родной метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858) 2019-07-08 23: 50: 26.039 2332-2332 / com.example.cribb I / Процесс: отправка сигнал. PID: 2332 SIG: 9

1 Ответ

0 голосов
/ 10 июля 2019

Пояснение:

Вы скрыли свою проблему с ?. Операторы, состоящие из ?, должны использоваться с осторожностью.

Оператор 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 там.

...