我正在尝试在片段中的kotlin中创建TextVIew页边距。由于某些原因,参数为空,并且在执行片段时程序崩溃。
打印实际的文本是可行的,只是当我尝试创建页边距时,它是行不通的。我尝试过放置安全的null检查以允许使用null,但最终以null异常结束。
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:布局参数不能为null 在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 / Process:正在发送 信号。 PID:2332 SIG:9
答案 0 :(得分:0)
您已经用?
隐藏了问题。
由?
组成的运算符必须小心使用。
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
参数。来自docs:
ViewGroup.LayoutParams
:此视图的布局参数不能为空
这就是为什么当您通过params==null
时应用崩溃的原因。
textView.layoutParams
返回null
来自docs:
与此视图关联的
LayoutParams
,;如果尚未设置任何参数,则为null
您要呼叫textView.layoutParams
来手动创建一个View
(不是通过xml
布局),
val textView = TextView(activity)
layoutParams
字段说明如何将特定的view
附加到封闭版式。因此,如果您已通过编程方式创建了View
,但尚未将其附加到任何ViewGroup
(例如FrameLayout
,LinearLayout
,ConstraintLayout
等)上, getLayoutParams
将返回null
,因为您的View
没有封闭的布局。
或者使用addView
方法之一将您创建的{em> 以编程方式添加到View
,或者创建ViewGroup
在布局xml文件中,然后将其放在View
中。