Reputation: 14565
IS there any way that I can update a TextView when user click on scene in AndEngine. I'm trying to update my text view,but it's throwing me an exception. Here is what I'm doing :
Adding the textview :
@Override
protected void onSetContentView() {
final FrameLayout frameLayout = new FrameLayout(this);
final FrameLayout.LayoutParams frameLayoutLayoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT);
this.mRenderSurfaceView = new RenderSurfaceView(this);
mRenderSurfaceView.setRenderer(mEngine);
final FrameLayout.LayoutParams surfaceViewLayoutParams = new FrameLayout.LayoutParams(super.createSurfaceViewLayoutParams());
frameLayout.addView(this.mRenderSurfaceView, surfaceViewLayoutParams);
hm = getIconNames();
text = new TextView(this);
text.setPadding(20, 10, 10, 10);
text.setText(hm.get(title));
text.setTextColor(Color.parseColor("#000000"));
frameLayout.addView(text);
//Create any other views you want here, and add them to the frameLayout.
this.setContentView(frameLayout, frameLayoutLayoutParams);
}
And I'm trying to do this :
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
if(this.mPhysicsWorld != null) {
if(pSceneTouchEvent.isActionDown()) {
title++;
text.setText(hm.get(title));
this.addFace(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
return true;
}
}
return false;
}
and it's throwing me this error :
12-15 12:32:15.584: E/AndroidRuntime(1468): FATAL EXCEPTION: UpdateThread
12-15 12:32:15.584: E/AndroidRuntime(1468): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.view.ViewRoot.checkThread(ViewRoot.java:3165)
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.view.ViewRoot.invalidateChild(ViewRoot.java:690)
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:716)
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2624)
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.view.View.invalidate(View.java:5341)
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.widget.TextView.checkForRelayout(TextView.java:5778)
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.widget.TextView.setText(TextView.java:2817)
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.widget.TextView.setText(TextView.java:2685)
12-15 12:32:15.584: E/AndroidRuntime(1468): at android.widget.TextView.setText(TextView.java:2660)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.hardartcore.stefan.kunchev.Game.onSceneTouchEvent(Game.java:245)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.entity.scene.Scene.onSceneTouchEvent(Scene.java:353)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.engine.Engine.onTouchScene(Engine.java:409)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.engine.Engine.onTouchEvent(Engine.java:395)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.input.touch.controller.BaseTouchController$TouchEventRunnablePoolItem.run(BaseTouchController.java:126)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.util.pool.RunnablePoolUpdateHandler.onHandlePoolItem(RunnablePoolUpdateHandler.java:47)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.util.pool.RunnablePoolUpdateHandler.onHandlePoolItem(RunnablePoolUpdateHandler.java:1)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.util.pool.PoolUpdateHandler.onUpdate(PoolUpdateHandler.java:85)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.input.touch.controller.BaseTouchController.onUpdate(BaseTouchController.java:68)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.engine.Engine.onUpdate(Engine.java:481)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.engine.Engine.onTickUpdate(Engine.java:459)
12-15 12:32:15.584: E/AndroidRuntime(1468): at org.anddev.andengine.engine.Engine$UpdateThread.run(Engine.java:685)
Any idea how to fix this?
Upvotes: 0
Views: 1068
Reputation: 9125
You can't update a native view from the update thread, you must do so in the UI thread. You can do:
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
if(this.mPhysicsWorld != null) {
if(pSceneTouchEvent.isActionDown()) {
title++;
text.post(new Runnable() {
@Override
public void run() {
text.setText(hm.get(title));
}
};
this.addFace(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
return true;
}
}
return false;
}
This will work, but you should consider using an AndEngine entity to display information to the user, maybe use ChangeableText
class which is pretty much like a text view, or use a HUD which lets you add several entites at once, to be shown over the scene.
Upvotes: 1