我正在尝试练习以列出获取传感器信息,但我得到了标题错误,我没有太多关于它的信息,有人可以帮助我吗?
练习说:
"此活动使用从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)
这里是完整的练习代码
答案 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”或其他......所以我正在寻找现在如何让这些变化变慢,但这个帖子的主题可以关闭,我希望这有助于其他人....