我正在使用ViewStubs
在我的布局中加载节目数据。由于我使用ButterKnife
来绑定布局组件,因此我有自定义类来保存各个viewstub布局的组件,例如,一个这样的viewstub如下所示。
<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 :(得分:4)
Android像这样膨胀ViewStub:
inflate
。这意味着,当您第二次调用代码时,原始ViewStub对象与View层次结构长期分离,并且已被完整视图替换。
就个人而言,我认为ViewStub的当前形式非常不方便,特别是在使用ButerKnife时。幸运的是,类本身非常简单,您始终可以创建一个自定义类,它会执行相同的操作并向其添加任何所需的方法(例如isInflated
,addInflateCallback
等)。顺便说一下,Android支持库开发人员也是如此。