代码之家  ›  专栏  ›  技术社区  ›  user2410644

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

  •  1
  • user2410644  · 技术社区  · 10 年前

    我正在尝试编写一个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");
    }
    

    当尝试运行这样的应用程序时,我在

     text.setText("test");
    

    这导致我假设没有找到TextView“文本”。通常在Android手机应用程序上

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

    直接在之后

    setContentView();
    

    但现在有了类似WatchViewStub和setOnLayoutInfratedListener的功能。也许有什么我监督过的?

    然而,如何在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 回复  |  直到 10 年前
        1
  •  3
  •   Maciej Ciemięga Tim    10 年前

    根据您的代码 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 s你只有一个 rect_activity: round_activity: 布局。

    你必须了解 WatchViewStub 作品您不能立即从矩形/圆形布局访问视图 setContentView 因为它们还没有充气。与您一样,您只能在 OnLayoutInflatedListener 侦听器回调。
    你试图找到你的 mTextView 在这个回调中,这是你应该做的。

    怎么了?

    您应该删除以下行:

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

    还有这个:(它也会导致你 NullPointerException )

      text.setText("test");
    

    只保留 m文本视图 领域

    你该怎么办?

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

      mTextView.setText("test");
    

    它必须包含 OnLayoutInfratedListener .

    最终代码应如下所示:

    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");
        }};
    }
    
        2
  •  1
  •   VenomVendor    10 年前

    你没有 文本框 在里面 activity_my.xml

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

        3
  •  0
  •   Janoti    10 年前

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

        4
  •  -1
  •   Sveinung Kval Bakken    10 年前

    而不是添加 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);