Как объявить фрагмент как скрытый в 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 занимает фактическое пространство просмотра.