无法将空子视图添加到ViewGroup

时间:2018-06-05 04:08:22

标签: view runtimeexception viewgroup

我正在尝试练习以列出获取传感器信息,但我得到了标题错误,我没有太多关于它的信息,有人可以帮助我吗?

练习说:

"此活动使用从XML创建的布局,基本上是一个空的线性布局。从Java我们使用对象" raiz"访问此布局。对于布局,我们将根据设备中的传感器添加一系列视图。为每个传感器添加:带有传感器名称的TextView;一个水平类型的LinearLayout包含:带有" X"的TextView。和该轴上的传感器值;一个TextView,传感器的值在" Y&#34 ;;一个TextView,其值为teh axis" Z",如果适用的话。显示传感器值的TextView的引用存储在aTextView [] []数组中,其中第一个索引标识传感器编号,第二个索引标识尺寸X,Y,Z。

onSensorChanged()方法创建一个循环来定位已更改的传感器索引,并使用读取的值修改与传感器对应的TextView;"

这是我的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/raiz"
android:orientation="vertical">
</LinearLayout>

这是我的活动主要

    package com.example.familia.sensores2;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.LinearLayout;
    import android.widget.TextView;

    import java.util.List;

    public class MainActivity extends AppCompatActivity implements SensorEventListener {

private List<Sensor> listaSensores;
private TextView aTextView[][] = new TextView[20][3];

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LinearLayout raiz = (LinearLayout) findViewById(R.id.raiz);
    SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
    listaSensores = sm.getSensorList(Sensor.TYPE_ALL);
    int n = 0;
    for(Sensor sensor:listaSensores){
        TextView mTextView = new TextView(this);
        mTextView.setText(sensor.getName());
        raiz.addView(mTextView);
        LinearLayout nLinearLayout = new LinearLayout(this);
        raiz.addView(nLinearLayout);
        for(int i = 0; i<2; i++){
            aTextView[n][i] = new TextView(this);
            aTextView[n][i].setText("?");
            aTextView[n][i].setWidth(87);
        }
        TextView xTextView = new TextView(this);
        xTextView.setText(" X: ");
        nLinearLayout.addView(xTextView);
        nLinearLayout.addView(aTextView[n][0]);
        TextView yTextView = new TextView(this);
        yTextView.setText(" Y: ");
        nLinearLayout.addView(yTextView);
        nLinearLayout.addView(aTextView[n][1]);
        TextView zTextView = new TextView(this);
        zTextView.setText(" Z: ");
        nLinearLayout.addView(zTextView);
        nLinearLayout.addView(aTextView[n][2]);
        sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
        n++;
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy){}

@Override
public void onSensorChanged(SensorEvent event){
    synchronized (this){
        int n = 0;
        for(Sensor sensor: listaSensores){
            if(event.sensor==sensor){
                for(int i=0; i<event.values.length; i++){
                    aTextView[n][i].setText(Float.toString(event.values[i]));
                }
            }
            n++;
        }
    }
}}

这里是我的错误日志

    06-05 03:10:17.523 17031-17031/com.example.familia.sensores2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.familia.sensores2, PID: 17031
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.familia.sensores2/com.example.familia.sensores2.MainActivity}: java.lang.IllegalArgumentException: Cannot add a null child view to a ViewGroup
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.lang.IllegalArgumentException: Cannot add a null child view to a ViewGroup
    at android.view.ViewGroup.addView(ViewGroup.java:4699)
    at android.view.ViewGroup.addView(ViewGroup.java:4681)
    at com.example.familia.sensores2.MainActivity.onCreate(MainActivity.java:49)
    at android.app.Activity.performCreate(Activity.java:7009)
    at android.app.Activity.performCreate(Activity.java:7000)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

这里是完整的练习代码

Master Android

1 个答案:

答案 0 :(得分:0)

经过一段时间的观察并阅读了很多,我发现了错误或错误......

首先是:

for(int i = 0; i<2; i++){
            aTextView[n][i] = new TextView(this);
            aTextView[n][i].setText("?");
            aTextView[n][i].setWidth(87);
        }

我在练习时使用了值“i&lt; 2”并说“i&lt; 3”这是因为当我第一次进行练习时我得到一个“索引越界”的错误,所以我想错误是在这一行,所以我将de值“3”更改为“2”,当我开始得到帖子的错误时(无法将空子视图添加到ViewGroup)。

无论如何,这个错误是因为在线:

TextView zTextView = new TextView(this);
        zTextView.setText(" Z: ");
        nLinearLayout.addView(zTextView);
        nLinearLayout.addView(aTextView[n][2]);

行:

nLinearLayout.addView(aTextView[n][2]);

发送了一个空值,导致错误“无法将空子视图添加到ViewGroup”。

然后当我将值返回到“3”时,我得到了“索引越界”的错误,所以我专注于下一行:

        for(Sensor sensor: listaSensores){
            if(event.sensor==sensor){
                for(int i = 0; i <event.values.length; i++){
                    aTextView[n][i].setText(Float.toString(event.values[i]));
                }
            }
            n++;
        }

并且错误是因为在aTextView上定义的矩阵是20x3,但是“event.values.length”返回的值大于3,为什么?,我不知道......我不确定它是否依赖在传感器类型或什么,所以我在那里添加了一个限制,并将线调整为:

        for(Sensor sensor: listaSensores){
            if(event.sensor==sensor){
                for(int i = 0; i <event.values.length && i <3 ; i++){
                    aTextView[n][i].setText(Float.toString(event.values[i]));
                }
            }
            n++;
        }

并且瞧......程序运行....最后我将活动主要布局调整为:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/raiz"
    android:orientation="vertical">
 </LinearLayout>
</ScrollView>

这是因为在我的手机上我有很多传感器而我无法查看全部,所以我添加了一个ScrollView。

现在,运行值的程序变化非常快,无法读取它,无论我是否将“SensorManager.SENSOR_DELAY_UI”的值修改为“SensorManager.SENSOR_DELAY_NORMAL”或其他......所以我正在寻找现在如何让这些变化变慢,但这个帖子的主题可以关闭,我希望这有助于其他人....