Andnengine обновляет textview, когда onSceneTouchEvent () - PullRequest
0 голосов
/ 15 декабря 2011

Есть ли способ обновить TextView, когда пользователь нажимает на сцену в AndEngine.Я пытаюсь обновить текстовое представление, но оно вызывает у меня исключение.Вот что я делаю:

Добавление 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 Ответ

1 голос
/ 15 декабря 2011

Вы не можете обновить собственное представление из потока обновления, вы должны сделать это в потоке пользовательского интерфейса.Вы можете сделать:

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

Это будет работать, но вы должны рассмотреть возможность использования сущности AndEngine для отображения информации пользователю, возможно, использовать класс ChangeableText, который очень похож на текстовое представление, или использоватьHUD, позволяющий добавлять несколько объектов одновременно для отображения на сцене.

...