Связь между пользовательским SurfaceView и представлениями Android по умолчанию - PullRequest
4 голосов
/ 31 декабря 2011

Моя проблема - связь между пользовательским GameView (расширяет SurfaceView) и TextView: я хочу установить текст TextView изнутри GameView. В основной деятельности я использую этот файл макета, он должен объяснить структуру моего приложения:

<?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>

Я не могу изменить текст TextView в моем объекте GameView, потому что невозможно прикоснуться к потоку пользовательского интерфейса из другого. Обработчик тоже не работает, потому что я не могу дать ссылку обработчика на конструктор GameView, который выполняется после загрузки этого xml-файла (чтение о конструкторе по умолчанию для xml-файлов, например, здесь Как я могу использовать GLSurfaceView в LinearLayout вместе с другими представлениями, такими как TextView или 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) { ... } 

и изменил мой onCreate в GameplayActivity:

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, но после нажатия кнопки «Назад» выдается еще одно исключение: Msgstr "Выполнение приостановки действия, которое не возобновлено: {org.gk.grApp / org.gk.grApp.MainMenuActivity}". Я только начал искать информацию об этом.

1 Ответ

5 голосов
/ 31 декабря 2011

Сначала сделайте ссылку на TextView на уровне активности:

TextView txv;

В onCreate назначьте эту ссылку:

txv = (TextView) findViewById (R.id.MyTextView);

Затем создайте метод в своей деятельности после onCreate, например:

public void setTextView(final String txt){
    MyActivity.this.runOnUiThread(new Runnable() {     
        public void run() {         
            txv.setText(txt);     
        } 
     });
}

Затем вы совершаете звонок из своего пользовательского вида:

((MyActivity) getContext ()). SetTextView (str);

...