Android Wear NullPointerException не может установить текст в TextView

Я пытаюсь написать приложение 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 не найден. Обычно на Android-телефонах телефон вполне нормально звонить

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

Непосредственно после

setContentView();

Но теперь есть такие вещи, как WatchViewStub и setOnLayoutInflatedListener. Может быть, я что-то наблюдал?

Однако как правильно указать свой TextView на платформе Android Wear?

Изменить:

activity_my.xml:

rect_activity.xml:

round_activity.xml:

4 ответа

Согласно коду вашей 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 прослушивателя OnLayoutInflatedListener. Вы пытались найти свой mTextView внутри этого обратного вызова - так вы должны это делать.

Что не так?

Вы должны удалить следующие строки:

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

и этот: (он также вызывает ваше NullPointerException)

text.setText("test");

и сохраните только поле mTextView.

Что вы должны сделать?

Добавьте следующее после mTextView = (TextView)stub.findViewById(R.id.text); :

mTextView.setText("test");

Он должен быть OnLayoutInflatedListener в 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"); }};
}


У вас нет TextView в activity_my.xml

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


если rect_activity.xml и round_activity.xml предназначены для разных действий, вам необходимо создать новые действия и вызвать setContentView для этих xml. Только после этого вы сможете использовать представления в своем коде.


Вместо добавления 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);

licensed under cc by-sa 3.0 with attribution.