2014-11-17 2 views
2

Я получаю сообщение об ошибке. Невозможно понять, как использовать дочерние представления в моем пользовательском представлении (относительная компоновка).Пользовательский макет с дочерними представлениями

<RelativeLayout > 

    <com.xxxxxx.FavouriteImageView 
     android:id="@+id/favorite_status" 
     android:layout_width="25dp" 
     android:layout_height="25dp" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:layout_marginRight="15dp" 
     android:clickable="true" > 

     <ImageView 
      android:id="@+id/favourite_iv" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:src="@drawable/yellow_star" 
      android:clickable="false" /> 

     <ProgressBar 
      android:id="@+id/favorite_spinner" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:visibility="gone" 
      android:clickable="false" /> 

    </com.xxxxxxxx.FavouriteImageView> 

public class FavouriteImageView extends RelativeLayout{ 

ImageView star; 
ProgressBar spinner; 
boolean isFavorite; 

Context context; 

public FavouriteImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this.context= context; 
    findChildViews();} 

public FavouriteImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.context= context; 
    findChildViews(); 
} 

public FavouriteImageView(Context context) { 
    super(context); 
    this.context= context; 
    findChildViews();} 


private void findChildViews(){ 

    star = (ImageView) findViewById(R.id.favourite_iv); 
    spinner = (ProgressBar) findViewById(R.id.favorite_spinner); 
} 

}

Проблема заключается в том, я продолжаю получать NPE, когда я когда-нибудь попробовать использовать star или spinner. Не знаю, как использовать представления для детей.

+1

Они еще нет в конструкторе. Почему бы вам просто не назвать этот код в своей деятельности? – Simas

ответ

4

Вы не можете найти эти виды в конструкторе. Представления child еще не добавлены к родительскому.

В вашем случае, вы можете переопределить метод addView() и сделать то же самое:

@Override 
public void addView(View child, int index, LayoutParams params) { 
    super.addView(child, index, params); 
    switch (child.getId()) { 
    case R.id.favourite_iv: 
     spinner = (ProgressBar) child; 
     break; 
    case R.id.favorite_spinner: 
     star = (ImageView) child; 
     break; 
    } 
} 
+0

Спасибо, что сработало –

1

Попробуйте использовать это в пользовательском классе макета:

@Override 
public void addView(@NonNull View child, int index, ViewGroup.LayoutParams params) { 
    super.addView(child, index, params); 
    if (child.getId() == R.id.favourite_iv) { 
     star = findViewById(R.id.favourite_iv); 
    } else if (child.getId() == R.id.favorite_spinner) { 
     spinner = findViewById(R.id.favourite_spinner); 
    } 
}