gpt4 book ai didi

android - 如何恢复以前显示的 fragment ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:51 28 4
gpt4 key购买 nike

我在我的项目中使用了兼容包 v4,但在将 Fragment 从 View 中移除后,我遇到了一个问题。我的 Activity 显示 2 个 fragment ...左侧是菜单框架,右侧是内容 Pane 。菜单框架有 3 个不同的菜单( fragment )可以显示。

这就是我替换菜单 fragment 的方式:

public void showMenuFragment( Fragment fragment, String tag ) {

showFragment( R.id.menu_frame, fragment, tag, false);
setLastMenuPushed( tag );
}

protected void showFragment( int resId, Fragment fragment, String tag, boolean addToBackStack ) {

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();

if ( fragmentManager.findFragmentByTag( tag ) != null && fragment.isAdded() ) {
transaction.remove( fragment );
}

transaction.replace( resId, fragment, tag ).setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN ).setBreadCrumbShortTitle( tag );

if ( addToBackStack ) {
transaction.addToBackStack( tag );
}

transaction.commit();
}

菜单 Fragment 需要先加载数据才能显示,因此我展示了一个加载微调器。第一次加载后,我不想再加载它,除非 Activity 完成。

当我调用 showMenuFragment(...) 时,我尝试使用 FragmentManager.findFragmentByTag(String tag) 传入一个 Fragment 但它是总是 null,所以每次我想显示不同的菜单时,我都必须制作一个新的 Fragment

我的问题是,在这些 Fragment 被其他菜单替换后,我该如何保留它们?我想避免保留对 Fragment 的手动引用,因为当设备旋转时,我的 Activity 类的实例被破坏,我会丢失这些引用。

编辑:简而言之,我希望 FragmentManager 跟踪以前的 Fragment 而不必将它们添加到返回堆栈。我不想点击后退按钮并看到显示的上一个菜单。

最佳答案

刚刚想通了。我没有在添加新 fragment 时删除 fragment ,而是隐藏它们,然后在我想再次显示它们时显示它们。这是我修改后的方法:

public void showMenuFragment( Fragment fragment, String tag, boolean addToBackStack ) {

showFragment( R.id.menu_frame, fragment, tag, getLastMenuPushed(), addToBackStack );
setLastMenuPushed( tag );
}

protected void showFragment( int resId, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();

if ( lastTag != null ) {
Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
if ( lastFragment != null ) {
transaction.hide( lastFragment );
}
}

if ( fragment.isAdded() ) {
transaction.show( fragment );
}
else {
transaction.add( resId, fragment, tag ).setBreadCrumbShortTitle( tag );
}

if ( addToBackStack ) {
transaction.addToBackStack( tag );
}

transaction.commit();
}

关于android - 如何恢复以前显示的 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8435632/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com