java - Android Wear 追加到 textView 会使应用程序崩溃

标签 java android nullpointerexception wear-os

所以,当我尝试检索应用程序上的传感器列表时,我遇到了一个奇怪的问题。

打印到日志效果很好。

当我尝试附加到 textView 时,它崩溃了。

这是我尝试附加的地方:

protected void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.activity_main);

    sensorTextView = (TextView) findViewById(R.id.sensorList);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    initialiseAccelerometer();

    sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
    List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
    for (Sensor sensor : sensors) {
        Log.d("Sensors", "" + sensor.getName());
        sensorTextView.append(sensor.getName());
    }

    sensorManager.registerListener(
                               this,
                               sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                               SensorManager.SENSOR_DELAY_NORMAL);
    mGestureDetector = new GestureDetectorCompat(this, new LongPressListener());
}

以及随后的错误:

java.lang.RuntimeException: Unable to start activity     
ComponentInfo{com.example.XXXXXX.XXXXXXXXXXX.MainActivity}: 
java.lang.NullPointerException: 
Attempt to invoke virtual method 
'void android.widget.TextView.append(java.lang.CharSequence)' on a null object reference

以及具有正确 ID 的 XML 文件:

android:id="@+id/sensorList"

任何人都可以指出我正确的方向或建议我做错了什么吗?

activity_main.xml:

<android.support.wearable.view.WatchViewStub
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/watch_view_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rectLayout="@layout/rect_activity_main"
app:roundLayout="@layout/round_activity_main"
tools:context=".MainActivity"
tools:deviceIds="wear"></android.support.wearable.view.WatchViewStub>

谢谢, 艾美特

最佳答案

This section文档指出了 WatchViewStub 的一些怪癖。特别要注意以下几点:

The layouts that you specify for square or round screens are not inflated until WatchViewStub detects the shape of the screen, so your app cannot access their views immediately. To access these views, set a listener in your activity to be notified when the shape-specific layout has been inflated

您可能太早尝试设置 TextView 引用,这就是为什么在您尝试附加文本时它为空。如果您改为使用 OnLayoutInflatedListener (如下面的示例代码(也来自文档)所示)来等待适当的圆形/方形布局膨胀,您应该会发现该引用已针对两种屏幕类型正确初始化:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_wear);

    WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override public void onLayoutInflated(WatchViewStub stub) {
            // Now you can access your views
            TextView tv = (TextView) stub.findViewById(R.id.text);
            ...
        }
    });
}

[请注意,我的一位同事指出,当前存在一个错误,要求您按照特定顺序定义方形布局 xml 属性和圆形布局 xml 属性才能正常工作 - 我不记得哪个需要放在第一位,如果遇到问题请注意]。

关于java - Android Wear 追加到 textView 会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33269634/

相关文章:

java - 如何在 Android 中制作持久抽屉导航?

Java 菜鸟火箭科学家

java - 使用 BouncyCaSTLe 生成 RSA key 时出现 NullPointerException

java - Java map 上的 NullPointerException。怎么了?

android - "Unable to start activity , NullPointerException"的原因

java - 单击按钮显示图像

不使用正则表达式的Java字符串解析

Android:获取字符串资源的缺失翻译

android - 根据点击的 TextView 将数据从应用程序小部件传递到 Activity

android - 接听拨出电话时 PhoneStateListener 状态是什么?