Android Wear NullPointerException无法在TextView上设置文本

时间:2014-07-22 08:46:23

标签: java android android-layout wear-os

我正在尝试编写Android Wear应用程序。现在我有一个TextView,并希望以编程方式设置文本。

private TextView mTextView;
private TextView text;

public void onCreate(Bundle savedInstance) {
  super.onCreate(savedInstance);
  setContentView(R.layout.activity_my);
  final WatchViewStub stub = (WatchViewStub)findViewById(R.id.watch_view_stub);
  text = (TextView)findViewById(R.id.text);
  stub.setOnLayoutInflatedListener((stub -> {
    mTextView = (TextView)stub.findViewById(R.id.text);
  }};

  text.setText("test");
}

尝试运行应用程序时,我会在

处获得nullpointerexception
 text.setText("test");

这让我认为找不到TextView“text”。通常在Android手机应用程序上,可以调用

text = (TextView)findViewById(R.id.text);

直接在

之后
setContentView();

但是现在有像WatchViewStub和setOnLayoutInflatedListener这样的东西。也许有一些我监督过的事情?

但是,如何在Android Wear平台上正确指定TextView?

修改

activity_my.xml:

<?xml version="1.0" encoding="utf-8"?>

<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_my"
app:roundLayout="@layout/round_activity_my"
tools:context=".MyActivity"
tools:deviceIds="wear">
</android.support.wearable.view.WatchViewStub>

rect_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MyActivity"
tools:deviceIds="wear_square">

<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/text"
    android:textSize="30sp"
    android:layout_centerInParent="true"/>

</RelativeLayout>

round_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyActivity"
tools:deviceIds="wear_round">

<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/text"
    android:textSize="30sp"
    android:layout_centerInParent="true"/>

</RelativeLayout>

4 个答案:

答案 0 :(得分:3)

根据您Activity的代码

private TextView mTextView;
private TextView text;

public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.activity_my);
    final WatchViewStub stub = (WatchViewStub)findViewById(R.id.watch_view_stub);
    text = (TextView)findViewById(R.id.text);
    stub.setOnLayoutInflatedListener((stub -> {
        mTextView = (TextView)stub.findViewById(R.id.text);
    }};

    text.setText("test");
}

为什么你有两个TextView?您只有rect_activity:round_activity:布局中的一个。

您必须了解WatchViewStub的工作原理。您无法在setContentView之后立即访问矩形/圆形布局中的视图,因为它们尚未膨胀。就像你一样 - 你只能在OnLayoutInflatedListener听众回调中访问你的观点 您试图在此回调中找到mTextView - 这是您应该这样做的方式。

有什么问题?

您应该删除以下行:

  text = (TextView)findViewById(R.id.text);

和这一个:(它也会导致你的NullPointerException

  text.setText("test");

并仅保留mTextView字段。

你应该怎么做?

mTextView = (TextView)stub.findViewById(R.id.text);之后添加以下内容:

  mTextView.setText("test");

必须包含OnLayoutInflatedListener

您的最终代码应如下所示:

private TextView mTextView;

public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.activity_my);
    final WatchViewStub stub = (WatchViewStub)findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener((stub -> {
        mTextView = (TextView)stub.findViewById(R.id.text);
        mTextView.setText("test");
    }};
}

答案 1 :(得分:1)

activity_my.xml

中没有 TextView

<击> text = (TextView)findViewById(R.id.text);

答案 2 :(得分:0)

如果rect_activity.xml和round_activity.xml用于不同的活动,则需要创建新活动并为这些xml调用setContentView 只有在那之后,您才能使用代码中的视图。

答案 3 :(得分:-1)

您可以扩展OnLayoutInflatedListener并在InsetActivity中设置内容视图,而不是添加InsetActivity.onReadyForContent()

import android.support.wearable.activity.InsetActivity; public class MainActivity extends InsetActivity { ... @Override public void onReadyForContent() { setContentView(R.layout.activity_main); someTextField = (TextView) findViewById(R.id.some_field);