Проверьте, является ли мой 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
} 
Другие вопросы по тегам