【发布时间】:2018-02-26 19:25:43
【问题描述】:
Android Studio 中的 addRule 函数有问题。 我循环遍历语言的数组列表。 对于每种语言,我都添加了一个 Textview。添加 1 个文本视图后,下一个文本视图应与第一个文本视图对齐。我在 addrule 行收到 NullpointerException。我设置和获取视图 ID 的方式是否错误?抱歉,XML 不完整。整个 Xml 代码都在相对布局中。
private void listLanguages() {
RelativeLayout relativelayout = (RelativeLayout) findViewById(R.id.addrole);
int e;
for (int i=0; i < languages.size(); i++) {
TextView textview = new TextView(AddRole.this);
if (i > 0) {
e = i-1;
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) textview.getLayoutParams();
lp.addRule(RelativeLayout.BELOW,e);
textview.setLayoutParams(lp);
}
textview.setText(languages.get(i));
textview.setId(i);
relativelayout.addView(textview);
}
XML:
<include
layout = "@layout/esnmis"
android:id="@+id/esnmis"
android:layout_width="match_parent"
android:layout_height="55dp">
</include>
<TextView
android:layout_width="250dp"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:layout_below="@+id/esnmis"
android:textSize="30dp"
android:gravity="center"
android:id="@+id/description"
android:layout_marginTop="4dp"
android:layout_centerHorizontal="true" />
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/description"
android:id="@+id/addrole">
</RelativeLayout>
<Button
android:text=""
android:textSize="20dp"
android:textAllCaps="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/insert"
android:layout_below="@+id/addrole"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp" />
错误:
E/AndroidRuntime: 致命异常: main 进程:com.example.obo.database,PID:11262 java.lang.NullPointerException:尝试从空对象引用上的字段“int android.view.ViewGroup$LayoutParams.width”读取 在 android.view.ViewGroup$LayoutParams.(ViewGroup.java:7346) 在 android.view.ViewGroup$MarginLayoutParams.(ViewGroup.java:7643) 在 android.widget.RelativeLayout$LayoutParams.(RelativeLayout.java:1345) 在 com.example.obo.database.AddRole.listLanguages(AddRole.java:107) 在 com.example.obo.database.AddRole.access$300(AddRole.java:28) 在 com.example.obo.database.AddRole$1$1.run(AddRole.java:79) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:7331) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
【问题讨论】:
-
你确定
AddRole.java:107是这条线lp.addRule(RelativeLayout.BELOW,e);吗?如果是这样,我猜lp什么都不是。你确定吗?在这一行放一个断点,查看textview.getLayoutParams()。我猜这是一个空对象。 -
您以编程方式创建了 TextView,因此您还必须创建 LayoutParameters 并将它们添加到您的 TextView。
-
正如 shadowsheep 提到的,您还必须创建
LayoutParams。Views 不会自动拥有LayoutParams。此外,您的 ID 必须至少为 1。如果您尝试使用 ID 为 0 的兄弟创建相对规则,它将被忽略。 -
非常感谢。这些信息很有帮助。
标签: android loops android-studio nullpointerexception