Как объявить фрагмент как скрытый в XML-макете

Моя активность объявляет все ее фрагменты графического интерфейса в одном XML-макете. В момент запуска нужно отобразить только несколько фрагментов; остальные отображаются, когда пользователь взаимодействует с приложением. Часть макета выглядит следующим образом:

<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 как false. Это означает, что моя активность должна проходить через загруженные фрагменты и вручную вызывать isHidden(true) на фрагменты, такие как detail_panel во время запуска.

Я бы предпочел объявить статус isHidden в макете XML. Однако установка android:visibility="gone" в объявлении <fragment> не изменяет статус isHidden, и я не могу найти документацию по другому атрибуту, который бы сделал трюк.

Можно ли установить атрибут XML на <fragment>, чтобы он был скрыт?

Примечание. Меня не интересует видимость вида, меня интересует значение fragment.isHidden(). Это влияет на то, как FragmentManager управляет обратным стеком и выполняет анимацию. Если вы вызываете transaction.show(fragment) на фрагмент, чей вид невидим или ушел, но значение fragment.isHidden() равно false, то FragmentManager не сделает вид видимым. Для справки см. http://developer.android.com/reference/android/app/Fragment.html#isHidden().

Ответ 1

Я столкнулся с аналогичной ситуацией, когда мне пришлось скрыть фрагмент.

Я просто включил фрагмент внутри 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>

Ответ 2

Основываясь на сообщении Jyo, используйте это:

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

Это работало для меня на API-уровне 23. "mFragment" - это фрагмент, который вы хотите скрыть.

Ответ 3

Этот ответ немного поздно подумал, что это может быть полезно для будущей справки. Видимость является частью класса View - Fragment расширяет объект, хотя не имеет доступа к значениям видимости. Возможность делает Фрагмент дочерним элементом FrameLayout и вызывает невидимость или уходит на макет. Это приведет к тому, что фрагмент окажется скрытым.

Надеюсь, это поможет!

Ответ 4

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();

 }

Ответ 5

мы имеем метод Visible для фрагмента не видно места Где Invisble занимает фактическое пространство просмотра.