2012-05-20 2 views
0

Существует два класса. MainActivity, в котором я устанавливаю представление, и ClassX, из которого я хочу обновить представление в MainActivity. ClassX - это AsyncTask, вызванный из MainActivity, если это актуально.Android/Java: изменить вид из другого класса?

Что я хочу сделать, так это изменить текст вида mainTextLog. Я объявил глобальную переменную TextView, а в методе onCreate() я установил ее в view с помощью findViewById().

private TextView logger; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    logger = (TextView) findViewById(R.id.mainTextLog); 

} 

К настоящему моменту я должен иметь возможность изменять текст из onCreate(), и я могу. Но так как я хочу, чтобы изменить его из другого класса (ClassX) мне нужно создать метод для этого:

public void setLogText(String text) { 
    logger.setText(text); 
} 

Но это не работает. Я попытался сделать logger и setLogText() статическим, но он все еще не работает. Приложение просто падает.

Это, вероятно, довольно легко, но у меня нет идей.

+0

У меня нет респ прокомментировать ответ, который был дан, и мне очень жаль, что это не является реальным ответом, но учтите, что вы не можете создать статический метод, который включает findViewById, поскольку findViewById не статичен. (насколько дает ответ, заданный ГГц). – SeaNick

ответ

1

Если вы используете AsyncTask, вам необходимо установить значение в onProgressUpdate или в onPostExecute.

Вы действительно должны прочитать документацию для AsyncTasks

You CAN NOT обновления пользовательского интерфейса от метода doInBackground, как это не выполняется в потоке пользовательского интерфейса и даст вам исключение.

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

+0

Хорошо, я вижу. Если бы я использовал onProgressUpdate(), как бы мне это сделать? – qwerty

+0

Если вы просто хотите обновить прогресс после того, как вы закончите, используйте onPostExecute. Если вы хотите обновить его по мере приближения к завершению (например, чтобы показать прогресс), вы используете onProgressUpdate, вызывая publishProgress: http://developer.android.com/reference/android/os/AsyncTask.html#publishProgress(Progress. ..).Действительно, вы должны просто прочитать документацию, в которой объясняется, как это сделать. –

+0

Хорошо, я посмотрю на это завтра (направляясь в постель сейчас). Благодаря! – qwerty

0

Одна из возможностей заключается в том, что: когда вы вызываете setLogText в другой класс X. MainActivity может не существовать больше, что делает logger пустой ссылкой?

1

Я сделал это много в приложении im, работающем над ним, своего типа приложения типа MDI на планшете Android.

Для того, чтобы делать то, что вы спрашиваете ....

в MainActivity имеют

public static void setText(String txt){ 
    ((TextView)findViewById(R.id.mainTextLog)).setText(txt); 
} 

затем в ребенке (или позвонив по телефону класс) называют его, как ...

MainActivity.setText("myTextToShow"); 

Вот и все ... im, используя уровень авиалинии Android 12-го уровня ... Если я помню, что он исправил, он тоже работал на уровне 7-го уровня.

Надеюсь, что это помогает ...

+0

Это почти тот же самый код, который у меня есть, за исключением того, что у меня уже есть представление, хранящееся в журнале. Однако это не сработало. – qwerty

+0

Является ли mainActivity нулевым в точке попытки установить его? если не вытащить точку останова в методе в главном, чтобы увидеть, если его даже стрельба ... – GHz