Невозможно добавить нулевое дочернее представление в ViewGroup. - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь выполнить упражнение, чтобы получить информацию о датчиках, но получаю ошибку названий, и у меня мало информации об этом, кто-нибудь может мне помочь?

В упражнении говорится:

"В этом упражнении используется макет, созданный из XML, который в основном является пустым линейным слоем. Из Java мы получаем доступ к этому макету с помощью объекта" raiz ". К макету мы добавим серию представлений в соответствии сдатчики, найденные в устройстве. Для каждого датчика добавляются: TextView с именем датчика, LinearLayout горизонтального типа, который должен содержать: TextView с «X» и значением датчика на этой оси, TextView со значениемдатчик в «Y»; TextView со значением оси «Z», если применимо. Ссылки на TextView, где отображаются значения датчиков, хранятся в массиве aTextView [] [], где первыйИндекс определяет номер датчика, а второй размер, X, Y, Z.

Метод onSensorChanged() делает цикл для определения индекса датчика, который имеетs изменились, и TextViews, соответствующие датчику, были изменены со значениями "

Вот мой макет

<?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) 

Здесь полный код упражнения

Мастер Android

1 Ответ

0 голосов
/ 08 июня 2018

через некоторое время, просматривая и читая много, я обнаружил ошибку или ошибки ...

сначала в строках:

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

я использовал значение "i <2 «когда в упражнении написано« я <3 », это потому, что когда я выполнил упражнение в первый раз, я получал ошибку для« индекса за пределами », поэтому я подумал, что ошибка была в этой строке, поэтому я изменилЗначение de от «3» до «2» и было, когда я начал получать сообщение об ошибке (Невозможно добавить нулевое дочернее представление в ViewGroup). </p>

в любом случае, эта ошибка была из-за строк:

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» или другое ... так что я сейчас смотрю, как сделать эти изменения медленнее, ноТема этого поста может быть закрыта, я надеюсь, что это поможет другим ....

...