2011-12-15 4 views
0

のときにTextViewを更新します。ユーザーがAndEngineのシーンをクリックすると、TextViewを更新する方法があります。テキストビューを更新しようとしていますが、例外が表示されます。Andnengineは、onSceneTouchEvent()が

を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); 
} 

そして、私はこれをやろうとしている:

@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; 
} 

、それが私にこのエラーを投げています:

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) 
をここで私がやっているものです

これを修正する方法はありますか?

答えて

1

更新スレッドからネイティブビューを更新することはできません。UIスレッドで行う必要があります。

@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; 
} 

これは動作しますが、あなたは多分ほとんどのテキストビューのようなものですChangeableTextクラスを使用して、ユーザに情報を表示するには、AndEngineエンティティを使用することを検討、またはできHUDを使用する必要があります。 あなたは行うことができます一度にいくつかのエントリーを追加して、シーンの上に表示します。