9

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

<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>

请注意,第二个片段android:visibility="gone"确实在屏幕上不可见。但是这段代码:

boolean bothVisible = firstFrag.isVisible() && secondFrag.isVisible();

Returns true,这是我没有预料到的。我想知道 usingandroid:visibility是否正确,因为我在文档中找不到任何有关它的信息。

4

2 回答 2

7

根据Fragment sourceisVisible定义为:

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

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

我认为问题在于,为了使您的片段膨胀,系统会创建一个布局来保存片段的视图。这是您设置为View.GONE的视图,而不是 Fragment 创建的内部视图。

我可能会建议将您的条件更改为:

findViewById(R.id.result_list_fragment).getVisibility() == View.VISIBLE
于 2013-05-09T17:15:31.663 回答
0

我试着这样做

XML

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lateral_login_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone"/>

代码

LoginFrag = LoginFragment.newIstance();     
FragmentTransaction LoginTransaction = fm.beginTransaction();
LoginTransaction.replace(R.id.lateral_login_frame, LoginFrag);
LoginTransaction.commit();

Log.d("visibility", String.valueOf(LoginFrag.isVisible()));

我的日志是:

05-09 19:07:54.236: D/visibility(3483): false

从 android文档中,isVisible() 如果片段当前对用户可见,则返回 true。这意味着它:(1) 已添加,(2) 其视图已附加到窗口,并且 (3) 未隐藏。

也许您还没有添加片段?从我无法分辨的代码中。希望这可以帮助。

于 2013-05-09T17:13:50.370 回答