Я разрабатываю представление, которое показывает стек сообщений, создающих fadeIn, fadeOut и время ожидания между ними. У него есть стек сообщений, и когда мне нужно отобразить некоторые из них, я добавил к нему. Этот вид не имеет конкретного дизайна, поэтому пользователь может настроить его так, как он хочет.findViewById возвращает null в пользовательском представлении с subviews внутри
Я написал хорошо 3 супер конструктора.
Схема XML является следующим:
[... Others views ...]
<com.example.lectorrss.Views.StatusMessage
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/statusMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:background="#6894ed">
<ProgressBar
android:id="@+id/progressBar"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/message"
android:layout_toRightOf="@id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="Hola"
android:textColor="#fff"></TextView>
</RelativeLayout>
</com.example.lectorrss.Views.StatusMessage>
[... Other views ...]
В этом случае, я хочу, чтобы мой пользовательский вид показывает представления, которые находятся внутри (прогресс бар + TextView), а затем применить поведение я хочу.
код моего CustomView является:
public class StatusMessage extends ViewGroup{
private List<String> messagesStack;
private Worker worker;
public StatusMessage(Context context) {
super(context);
}
public StatusMessage(Context context, AttributeSet attrs){
super(context, attrs);
}
public StatusMessage(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
TextView txtView = (TextView) this.findViewById(R.id.message);
if(txtView == null){
Log.d("BrowsePortal", "TextView null");
}else{
// HERE, THE CODE CAN FIND OK THE VIEW I WANT
Log.d("BrowsePortal", "TextView not null");
}
worker = new Worker(this);
worker.execute();
}
[Other logic code about view]
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
}
}
Но мой взгляд, нужно время ожидания между сообщениями и использует анимацию, мне нужно создать AsyncTask:
public class Worker extends AsyncTask<Void,String,Void>{
private StatusMessage view;
public Worker(StatusMessage view) {
this.view = view;
}
@Override
protected Void doInBackground(Void... arg0) {
[I supressed all logic code here]
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
TextView txtView = (TextView) view.findViewById(R.id.message);
if(txtView == null){
// But here the code return null
Log.d("BrowsePortal", "TextView null");
}else{
Log.d("BrowsePortal", "TextView not null");
}
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
[I supressed all logic code here]
}
}
Моя проблема заключается что из asynctask, в progressUpdate, когда мне нужно получить доступ к textview, findviewbyid возвращает null. Но, пытаясь получить доступ к такому же представлению из пользовательского класса представления вместо asynctask, он работает. Почему из класса вида я могу получить доступ к textview, но из asynctask нет?
Кроме того, в post execute тот же код возвращает мне null.
Моя asynctask хорошо принимает в своем конструкторе вид, поэтому отсюда будет хорошо работать, как с пользовательского вида.
Какой код затенен «[Другой логический код о виде]»? Вы удаляете представление в любой момент жизненного цикла приложений? – Knossos
@Knossos '[Другой логический код о представлении]' - это код, связанный с свойством StatusMessage.stackMessages. Существуют такие методы, как 'addMessageToStack()', 'getNextMessageFromStack()', 'areThereMessages()' ... Не важно, я, тем не менее, для этого я его подавил. Также они не работают с представлением. С другой стороны, в классе «Worker» скрытый код связан с анимацией, временем ожидания и т. Д. Я предположил, что код анимации может делать что-то неправильно, но несколько минут назад удалите все, оставив AsyncTask только с помощью 'if' проверка TextView, но она все еще плохо работает. – korima
Я сбитый с толку, должен сказать. Если в onAttachedToWindow() вы получаете «TextView not null», а в AsyncTask вы получаете «TextView null». Не могли бы вы попробовать два теста? 1. Создайте переменную-член TextView и создайте экземпляр, используя представление в самом конструкторе.Удалите инстанционный код из onProgressUpdate. Работает? 2. Пропустите TextView непосредственно в AsyncTask, установите его в переменную-член и проверьте его целостность в onProgressUpdate(). – Knossos