2014-09-14 2 views
0

Похоже на другие вопросы, но я не нашел решений. У меня есть макет, определенный XML-файл:findViewById() from custom view return null

main_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    ... > 

     <package.CustomView 
     ... > 
     </package.CustomView> 

     <TextView 
     android:id="@+id/text_view" 
     ... > 
     </TextView> 

    </RelativeLayout> 

где CustomView расширяет SurfaceView.

В onCreate У меня установленContentView (R.layout.main_layout). Теперь, если я хочу, чтобы раздуть, например, TextView в деятельности я должен добавить после setContentView (...)

TextView textView = (TextView) findViewbyId(R.id.text_view); 

и все работает отлично. Но если я поместил эту строку в метод моего CustomView, я получил нулевой указатель. Зачем?

ответ

1

findViewById() будет проходить только по данному виду и его детям. Он не найдет взглядов братьев и сестер. Ваше текстовое представление является дочерним элементом пользовательского представления, а не дочернего.

В активном представлении корня, где начинается обход findViewById(), является окно активности (Activity.findViewById()). В представлении это сама точка зрения (View.findViewById()).

+0

Спасибо! Очень ясно! – bluePhlavio

0

Понимание полезного объяснения выше, я хотел бы дать простой способ найти вид по его ID из CustomViews:

(Activity)getContext()).findViewById(R.id.youViewToBeFound); 

CustomView внутри вашего класса.

Этот код должен быть запущен ПОСЛЕ кода конструктора, например. внутри onAttachedToWindow()

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