2016-11-28 3 views
4

Я использую ViewStubs для загрузки отображаемых данных в свой макет. Поскольку я использую для связывания компонентов макета, у меня есть пользовательские классы, которые содержат отдельные компоненты макета viewstub, например, один такой viewstub выглядит следующим образом.ViewStub должен иметь нулевой вид ViewGroup viewParent

<ViewStub 
     android:id="@+id/featuredContentStub" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:inflatedId="@+id/featuredContent" 
     android:layout="@layout/featured_content" /> 

Класс для обработки @layout/featured_content компонентов заключается в следующем:

public class FeaturedContentView { 
     @BindView(R.id.art) 
     ImageView art; 
     @BindView(R.id.shade) 
     View shade; 
     @BindView(R.id.title) 
     TextView featuredTitle; 
     @BindView(R.id.performer) 
     TextView performer; 
     @BindView(R.id.featured_title) 
     KerningTextView featuredText; 
     @BindView(R.id.play_button) 
     Button play; 
     @BindView(R.id.shareText) 
     TextView shareText; 
     @BindView(R.id.addToFavorites) 
     ImageView addToFavs; 

     FeaturedContentView(View view) { 
      ButterKnife.bind(this, view); 
     } 
    } 

Я раздуть макет так:

if (viewstub != null) { 
     View view = viewstub.inflate(); 
     featuredContentView = new FeaturedContentView(view); 
} 

выше метод вызывается в двух разных местах в моем фрагмент. Он правильно накачивается в первый раз, но не во второй раз ссылается на java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent.

Как я могу справиться с этой ситуацией.

+0

Можете ли вы опубликовать весь фрагмент кода, я сомневаюсь в вашем 'viewstub.inflate()' –

ответ

3

Android раздувает ViewStub так:

  1. Первоначально добавить ViewStub для просмотра иерархии так же, как и любой другой View
  2. Заменить этот вид с указанным макетом при вызове inflate.

Это означает, что когда ваш код вызывается во второй раз, исходный объект ViewStub долгое время отсоединяется от иерархии представления и уже заменяется полным представлением.

Лично я считаю, что ViewStub в текущей форме очень неудобен, особенно при работе с ButerKnife. К счастью, сам класс очень прост, вы всегда можете создать собственный класс, который делает то же самое и добавляет к нему любые необходимые методы (например, isInflated, addInflateCallback и т. Д.). Разработчики библиотеки поддержки Android имеют то же самое, кстати.