我的问题是自定义GameView(扩展SurfaceView)和TextView之间的通信:我想从GameView内部设置TextView的文本。 在主要活动中,我正在使用这个布局文件,它应该解释我的应用程序的结构:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#00ff00"
>
<TextView
android:id="@+id/scoreTV"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="score: 0"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="back"
android:layout_alignParentRight="true" />
</RelativeLayout>
<org.gk.grApp.GameView
android:id="@+id/gameplayScreen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
我无法在GameView对象中更改TextView的文本,因为无法从其他人触摸UI线程。 处理程序也不起作用,因为我无法给予处理程序对GameView的构造函数的引用,这是在加载此xml文件之后执行的(读取xml文件的默认构造函数,例如How can I use GLSurfaceView in a LinearLayout together with other Views, such as TextView or Button?)。 你知道我现在应该做什么吗?也许我的演绎错了,所以请告诉我这个。
编辑:我改变了我的xml文件,而不是我现在拥有的GameView:
<LinearLayout
android:id="@+id/gameplayScreen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</LinearLayout>
我还在构造函数的签名中添加了一个参数(第三个):
public GameView(Context context, AttributeSet as, Handler h) { ... }
并在GameplayActivity中更改了我的onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gameplay);
LinearLayout ll = (LinearLayout)findViewById(R.id.gameplayScreen);
GV = new GameView(this, null, scoreHandler);
ll.addView(GV);
}
它可以工作,现在我可以设置TextView的文本但是在单击后退按钮后会抛出另一个异常: “执行暂停未恢复的活动:{org.gk.grApp / org.gk.grApp.MainMenuActivity}”。我刚刚开始搜索有关此事的信息。
答案 0 :(得分:5)
首先在活动级别上引用TextView:
TextView txv;
在onCreate中分配此引用:
txv =(TextView)findViewById(R.id.MyTextView);
然后在onCreate之后在Activity中创建一个方法,如下所示:
public void setTextView(final String txt){
MyActivity.this.runOnUiThread(new Runnable() {
public void run() {
txv.setText(txt);
}
});
}
然后您从自定义视图中拨打电话:
((MyActivity)getContext())。setTextView(str);