我正在尝试编写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>
答案 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
<击> 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);