片段android:xml布局定义中的可见性

Mic*_*hal 9 android android-layout android-fragments

它是如何工作的?我有如下布局:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/search_form_fragment"
        android:name="FragmentClass"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <fragment
        android:id="@+id/result_list_fragment"
        android:name="FragmentClass"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

注意第二个片段有android:visibility="gone",实际上它在屏幕上不可见.但是这段代码:

boolean bothVisible = firstFrag.isVisible() && secondFrag.isVisible();
Run Code Online (Sandbox Code Playgroud)

回报true,这是我没想到的.我想知道使用android:visibility是否正确,因为我在文档中找不到任何相关信息.

ian*_*ake 7

根据片段源,isVisible定义为:

 final public boolean isVisible() {
    return isAdded() && !isHidden() && mView != null
            && mView.getWindowToken() != null && 
               mView.getVisibility() == View.VISIBLE;
}
Run Code Online (Sandbox Code Playgroud)

即,它附加到活动,它不被隐藏(通过FragmentTransaction.hide),视图被膨胀,视图附加到窗口,并且片段内部视图View.VISIBLE.

我相信问题在于,为了给你的片段充气,系统会创建一个布局来保存Fragment的视图.这是您要设置View.GONE的视图,而不是Fragment创建的内部视图.

我可能会建议你改变你的状况:

findViewById(R.id.result_list_fragment).getVisibility() == View.VISIBLE
Run Code Online (Sandbox Code Playgroud)