2016-07-24 8 views
1

Я хочу получить представление из его идентификатора из атрибута в xml. Я пробовал с getParent(), но он возвращает null.Получить представление по ID из атрибутов в пользовательском представлении Класс

XML

<RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:ntwldg="http://schemas.android.com/apk/res-auto" 
     android:orientation="vertical" 
     android:background="@drawable/background_settings" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <TextView 
      android:id="@+id/revealView" 
      android:gravity="center" 
      android:text="TEST" 
      android:background="@android:color/darker_gray" 
      android:visibility="invisible" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 

    <com.dot.networkloading.NetworkLoading 
      android:id="@+id/network_loading" 
      ntwldg:text="Youtube" 
      ntwldg:image="@drawable/ic_youtube" 
      ntwldg:imageBackground="@drawable/ic_youtube" 
      ntwldg:revealView="@id/revealView" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 
</RelativeLayout> 

attributerevealView ссылается на View выше.

Код - NetworkLoading (INIT())

 title = (TextView) findViewById(R.id.title); 
     image = (ImageView) findViewById(R.id.image); 
     imageBackground = (ImageView) findViewById(R.id.imageBackground); 
     finishView = findViewById(R.id.revealView); 

     String text = attributes.getString(R.styleable.network_loading_text); 
     imageId = attributes.getResourceId(R.styleable.network_loading_image, 0); 
     imageBackgroundId = attributes.getResourceId(R.styleable.network_loading_imageBackground, 0); 

     finishView = ((View) getParent()).findViewById(attributes.getResourceId(R.styleable.network_loading_revealView, R.id.revealView)); 
+0

Непонятно, что именно вы спрашиваете. Если вы просто пытаетесь получить ссылку на 'NetworkLoading'' View', а 'findViewById (R.id.revealView)' успешно возвращает это 'TextView', то' findViewById (R.id.network_loading) 'будет дайте вам 'NetworkLoading'' View'. –

+0

@MikeM. Я хочу получить файл R.id.revealView из NetworkLoading, передав этот id из xml. –

+0

О, ладно, теперь я понял. Где именно этот код? Входит ли он в конструктор 'NetworkLoading' или вызван? –

ответ

2

Похоже, что вы пытаетесь найти свой revealView слишком рано. В конструкторе View еще не добавлен в макет, в котором он находится, поэтому getParent() вернет null. Сохраните идентификатор ресурса для revealView в качестве поля, получите его значение в конструкторе, а затем найдите View в методе onAttachedToWindow().

В коде, который вы опубликовали, удалите последнюю строку - последнюю строку finishView = ... - и вместо этого сохраните идентификатор ресурса в своем поле.

revealViewId = attributes.getResourceId(R.styleable.NetworkLoading_revealView, R.id.revealView); 

Затем найдите View в методе onAttachedToWindow() вместо этого.

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 

    finishView = ((View) getParent()).findViewById(revealViewId); 
    ... 
} 
+1

Это работает, спасибо. –

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