如何将片段声明为隐藏在XML布局中

时间:2013-11-15 02:14:32

标签: android xml fragment

我的活动在单个XML布局中声明其所有GUI片段。它只需要在发布时显示一些片段;当用户与应用程序交互时,其余部分会显示。布局的一部分如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <fragment
        android:id="@+id/map_panel"
        android:name="com.example.MapPanel"
        android:layout_width="match_parent"
        android:layout_height="@dimen/map_panel_height" />
    <fragment
        android:id="@+id/list_panel"
        android:name="com.example.ListPanel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/map_panel" />
    <fragment
        android:id="@+id/detail_panel"
        android:name="com.example.DetailPanel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/map_panel"
        android:visibility="gone" />

我的意图是list_panel片段在启动时可见,detail_panel片段被隐藏,直到用户从列表中选择某些内容。

默认情况下,片段以isHidden属性为假开始。这意味着我的活动必须迭代加载的片段,并在启动时手动调用isHidden(true)等片段上的detail_panel

我更愿意在XML布局中声明isHidden状态。但是,在android:visibility="gone"声明中设置<fragment>不会更改isHidden状态,而且我找不到任何其他属性的文档可以解决问题。

是否可以在<fragment>上设置XML属性以使其隐藏?

注意:我不关心视图可见性,我关注fragment.isHidden()值。这会影响FragmentManager如何操纵后台堆栈并执行动画。如果在视图不可见或已消失的片段上调用transaction.show(fragment),但fragment.isHidden()值为false,则FragmentManager不会使视图可见。请参阅http://developer.android.com/reference/android/app/Fragment.html#isHidden()以供参考。

5 个答案:

答案 0 :(得分:10)

我遇到了类似的情况,我不得不隐藏片段。

我只是将片段包含在LinearLayout中,并将布局标记为可见/消失。

<LinearLayout
    android:id="@+id/map_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="visible" >

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment" />
</LinearLayout>

答案 1 :(得分:6)

根据Jyo的帖子,使用:

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.hide(mFragment);
fragmentTransaction.commit();

这在API级别23上对我有用。mFragment是您要隐藏的片段。

答案 2 :(得分:0)

这个答案有点晚,以为它可能对将来的参考有所帮助。可见性是View类的一部分 - 虽然无法访问可见性值,但Fragment扩展了对象。一种可能性是使Fragment成为FrameLayout的子元素并调用不可见或者在布局上消失。这将导致片段看起来被隐藏。

希望它有所帮助!

答案 3 :(得分:0)

public void showHideFrgament(final Fragment fragment){

    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.setCustomAnimations(android.R.animator.fade_in,
                            android.R.animator.fade_out);

    if (fragment.isHidden()) {
                    ft.show(fragment);
                    Log.d("hidden","Show");
                } else {
                    ft.hide(fragment);
                    Log.d("Shown","Hide");                        
                }
                ft.commit();

 }

答案 4 :(得分:-1)

我们有片段的isVisible方法 将可见性设置为Gone不会占用任何空间 而Invisible占用了实际的视图空间。