Доступ к элементам пользовательского интерфейса в 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-Да, я искал другие подобные вопросы, но все они хотя и кажутся одинаковыми, на самом деле совершенно разные.
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