2014-09-25 2 views
0

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

+0

Какой код затенен «[Другой логический код о виде]»? Вы удаляете представление в любой момент жизненного цикла приложений? – Knossos

+0

@Knossos '[Другой логический код о представлении]' - это код, связанный с свойством StatusMessage.stackMessages. Существуют такие методы, как 'addMessageToStack()', 'getNextMessageFromStack()', 'areThereMessages()' ... Не важно, я, тем не менее, для этого я его подавил. Также они не работают с представлением. С другой стороны, в классе «Worker» скрытый код связан с анимацией, временем ожидания и т. Д. Я предположил, что код анимации может делать что-то неправильно, но несколько минут назад удалите все, оставив AsyncTask только с помощью 'if' проверка TextView, но она все еще плохо работает. – korima

+0

Я сбитый с толку, должен сказать. Если в onAttachedToWindow() вы получаете «TextView not null», а в AsyncTask вы получаете «TextView null». Не могли бы вы попробовать два теста? 1. Создайте переменную-член TextView и создайте экземпляр, используя представление в самом конструкторе.Удалите инстанционный код из onProgressUpdate. Работает? 2. Пропустите TextView непосредственно в AsyncTask, установите его в переменную-член и проверьте его целостность в onProgressUpdate(). – Knossos

ответ

0

Проблема была с этой линии:

import android.R меняю на import [app_package].R;.

Тогда, когда я ставлю эту строку:

TextView txtView = (TextView) view.findViewById(R.id.message);

... метод не мог найти TextView, потому что использует в качестве идентификатора ресурса из android.R вместо package.R.

Самое странное, что по видам деятельности, которые я сделал это время назад, иногда я делал ту же ошибку, но я мог быстро исправить, потому что Eclipse сказал мне, что указанный ресурс не был найден, подчеркивая линию ресурсов, но по какой-то причине, в этом случае не уведомил меня. Возможно, R.id.message зарезервирован для android.R.

+0

Удостоверьтесь, что вы принимаете свой собственный ответ, как только сможете, чтобы другие знали, в чем проблема. – Knossos

Смежные вопросы