Добавить в макет Android программно - затем получить доступ к тому, что было создано из другого метода - PullRequest
0 голосов
/ 21 апреля 2011

Я создаю макет программно и мне нужно добавить TextView.Единственная проблема заключается в том, что мне нужно сделать TextView глобальной переменной, чтобы к ней можно было обращаться из разных методов (нужно вызывать метод setText () в другом месте).

ScrollView scroll = new ScrollView(this);
LinearLayout linear = new LinearLayout(this);
linear.setOrientation(LinearLayout.VERTICAL);
scroll.addView(linear);

TextView time = new TextView(this);
time.setText("Some text");
linear.addView(time);

new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
    time.setText("seconds remaining: " + millisUntilFinished / 1000);
} // 'time' not accessible

public void onFinish() {
 time.setText("done!");
}
}.start(); */

this.setContentView(scroll);

Итак, моя проблема в том, что я создаюTextView «time», но метод CountDownTimer не может получить к нему доступ.Я пытаюсь иметь TextView time = new TextView(this); в верхней части моего кода с конструкторами, чтобы он был глобальным, но это вызывает исключение - «невозможно создать экземпляр компонента ComponentInfo» и «исключение нулевой точки».Исключение не указывает, какая именно строка вызывает проблему, но это точно TextView timeLeft = new TextView(this);!

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

Я бы сделал переменную-член в вашей Деятельности (mTime). Тогда CountDownTimer сможет получить доступ к переменной-члену в любое время.

В качестве альтернативы вы можете объявить time final:

final TextView time = new TextView(this);
0 голосов
/ 21 апреля 2011

Вы можете присвоить id (скажем: myTextViewId) своему TextView перед добавлением его в представление, а позже вы можете просто обратиться к этому TextView с помощью findViewById(myTextViewId);.

.та же самая ситуация, если вы надуете ваш TextView, используя xml-файл, и назначаете внутри него идентификатор.Затем вы можете обратиться к этому TextView с помощью findViewById(R.id.myTextView);.

Или, наконец, поскольку вы не можете сделать этот TextView одновременно и final (он не будет сразу инициализирован, ни в конструкторе), ни class-level (приватный, защищенный и т. Д.), Я бы посоветовал сделать его приватной переменной внутри вашего класса.

Чтобы получить к нему доступ, ваш метод должен выполняться в потоке пользовательского интерфейса, но у таймера есть собственный поток, поэтому вы должны использовать Handler, а из метода запуска TimreTask просто отправить пустуюсообщение к нему.В вашем методе Handler handleMessage(Message msg) вы можете безопасно получить доступ к вашему TextView, будь то член вашего класса или просто зная его id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...