Проверьте, является ли мой ViewStub раздутым / видимым и является ли нуль / не ноль?
Я видел кучу других постов, прежде чем задавать этот вопрос. Ни у кого, казалось, не было определенного решения.
Я столкнулся с проблемой с ViewStub, где я хочу проверить, раздут ли ViewStub или нет (видимый или нет). На этом основании у меня есть куча других дел.
Я использую два ViewStubs и кнопку в каждом макете ViewStub, а именно в layout /abc, и layout/def будет раздувать другой ViewStub.
<ViewStub
android:id="@+id/abc_stub"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout="@layout/abc" />
<ViewStub
android:id="@+id/def_stub"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout="@layout/def" />
Проблема, с которой я сталкиваюсь, состоит в том, что ViewStub, который не раздувается, не является нулевым, в то время как я ожидаю, что это будет нулевым.
Есть что-то, что я пропускаю?
4 ответа
Итак, что я в итоге сделал, это установил OnInflateListener (ViewStub.OnInflateListener inflateListener)
ViewStub stub1 = ((ViewStub)findViewById(KR.get(R.abc_stub)));
stub1.setOnInflateListener(new ViewStub.OnInflateListener{
@Override
public void onInflate(ViewStub paramViewStub, View paramView) {
// Set a class boolean if it was inflated
}
});
Если логическое значение true, то stub1 - это экран, который работает. Иначе его нет.
Спасибо @pskink за помощь.
Я хотел бы представить альтернативное решение, которое не зависит от слушателя.
View stub = findViewById(R.id.my_view_stub);
if(stub instanceof ViewStub) {
// it have not been inflated
} else {
// if have been inflated
}
логика заключается в том, что после инфляции ViewStub
удаляется из иерархии представления и заменяется тем, что было в надутом макете.
Это означает stub
будет instanceOf FrameLayout/LinearLayout/Button
или любой другой вид был на раздутом макете и фактическом ViewStub
экземпляр исчез, и если вы не держите ссылку на него, он мог бы быть даже собранным мусором.
Если кто-то все еще путается в этом...
1. Что делает
ViewStub.inflate()
на самом деле делать?
// checkout android.view.ViewStub#inflate
// ...
// Actual inflate the xml
final View view = inflateViewNoAdd(parent);
// removte the same id view in parent, then re-add in view just inflated.
replaceSelfWithView(view, parent);
// ...
2. Как проверить, надулся ли он?
Как и ответ Budius, ниже приведена версия kotlin:
inline fun <reified T : View> View?.findViewStubById(id: Int): T? {
if (this == null) {
return null
}
val find = this.findViewById<View>(id)
if (find is ViewStub) {
return find.inflate() as T
}
return find as T
}
Более элегантное решение:
if (mViewStub.getParent() != null) {
//have not been inflated
mViewStub.inflate();
} else {
//already inflated
}