Доступ к элементам пользовательского интерфейса в Activity из другого класса



У меня проблема с этим кодом



setContentView(R.layout.game);
TextView text = (TextView) findViewById(R.id.qwe_string);
text.setText("Hello Android");


Он работает, если он находится внутри действия, но если это не так, очевидно, он дает ошибки:



The method findViewById(int) is undefined for the type new TimerTask(){}
The method setContentView(int) is undefined for the type new TimerTask(){}


Код находится внутри таймера в отдельном классе (не activity). Полный код выглядит следующим образом.



//main timer task for ingame time processing
static Timer gameTimer = new Timer();
static TimerTask gameTimerTask = new TimerTask() {
@Override
public void run() {
setContentView(R.layout.game);
TextView text = (TextView) findViewById(R.id.qwe_string);
text.setText("Hello Android");
}
};


Я пытался изменить его вот так



ScreenGame.this.setContentView(R.layout.game);
TextView text = (TextView) ScreenGame.this.findViewById(R.id.qwe_string);
text.setText("Hello Android");


Но это все равно не работает : (



PS-Да, я искал другие подобные вопросы, но все они хотя и кажутся одинаковыми, на самом деле совершенно разные.

512   2  

2 ответов:

ScreenGame.this.setContentView(R.layout.game);
TextView text = (TextView) ScreenGame.this.findViewById(R.id.qwe_string);
text.setText("Hello Android");

В точности совпадает с

setContentView(R.layout.game);
TextView text = (TextView) findViewById(R.id.qwe_string);
text.setText("Hello Android");

Неверный код

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

// In the parent:
child.getTextView().setText("Hello galaxy!");

// with the child method:
TextView getTextView () {
  return (TextView) findViewById(R.id.qwe_string);
}

Правка: Подробнее:

Код, который я дал, был не очень хорош, я не очень хорошо понял вашу проблему... Надеюсь, что теперь я это сделаю, постараюсь исправиться.

Сделать отдельный класс, например MyTimer, который будет расширять класс TimerTask:

class MyTimer extends TimerTask {
  // your class
}

Создайте конструктор, который исключает TextView в качестве аргумента и сохраняет ссылку на него.

TextView theTextView;
MyTimer (TextView tv) {
  this.theTextView = tv;
}

Теперь реализуем run():

@Override
public void run() {
    setContentView(R.layout.game);
    thetextView.setText("Hello Galaxy!");
}

Вызовите этот класс, используя следующий код:

static TimerTask gameTimerTask = new MyTimer((TextView) findViewById(R.id.qwe_string));

Я надеюсь, что это все правильно, я должен сделать это по памяти, так как у меня нет никакой среды тестирования. По крайней мере, это должно помочь вам в правильном направлении.

Вам понадобится:

ScreenGame.this.runOnUiThread( new Runnable(){
  public void run(){
   TextView text = (TextView) ScreenGame.this.findViewById(R.id.qwe_string);
   text.setText("Hello Android");  }
 });

И вы должны вызвать следующую строку в onCreate() из ScreenGame:

setContentView(R.layout.game);

Comments

    Ничего не найдено.