android - popBackStack导致反复调用fragment的oncreateView

标签 android android-fragments fragment back-stack fragmentmanager

我有 3 个 fragment A、B、C。我编写了一段代码来替换它们并维护后台堆栈:

 public void addFragment(Fragment fragmentToAdd, String fragmentTag) {
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        Fragment activeFragment = getActiveFragment();
        FragmentTransaction fragmentTransaction = supportFragmentManager
                .beginTransaction();
        if (null != activeFragment) {
            fragmentTransaction.hide(activeFragment);
        }
        fragmentTransaction.replace(R.id.layout_child_activity, fragmentToAdd,
                fragmentTag);

       if (supportFragmentManager.getBackStackEntryCount() > 1) {
            supportFragmentManager.popBackStack();
        }
        fragmentTransaction.addToBackStack(fragmentTag);
        fragmentTransaction.commit();
    }

这里是这段代码

if (supportFragmentManager.getBackStackEntryCount() > 1) {
    supportFragmentManager.popBackStack();
}

如果堆栈长度大于 1,我将用于弹出最新的 fragment 。现在由于这个原因,当长度大于 1 时,它会一次又一次地调用 onCreate View 。 喜欢:

  1. 打开A。
  2. 打开B。
  3. 打开 C。(如果打开 C。调用 A 的 onCreateView。)

为什么我会出现这种行为?当我删除那个斜体代码时,它并没有发生。

最佳答案

正如文档所说,行为是正常的,来自后台事务。 backstack从不保存Fragments,它只保存事务

enter image description here

http://developer.android.com/intl/es/guide/components/fragments.html

我所做的,我不确定是否是最好的方法,但是 当我想清除所有交易时,我会这样做

1) 在您的 Activity 中检查后台堆栈中是否有任何事务, 并在你的 fragment 中添加一个标志,在你的情况下是 A

       int backStackCount = getSupportFragmentManager().getBackStackEntryCount();

       if(backStackCount > 0) {
           Transactions.MUST_DETACH_FROM_BACKSTACK = true;
           getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
       }

2) 在 fragment A 中,获取标志并删除 fragment onCreateView 并像这样返回 null

public class Transactions extends android.support.v4.app.Fragment{

public static boolean MUST_DETACH_FROM_BACKSTACK = false;

public Transactions() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.i("FRAGMENT", "onCreateView "+MUST_DETACH_FROM_BACKSTACK);
    // Inflate the layout for this fragment
    if (MUST_DETACH_FROM_BACKSTACK) {
        MUST_DETACH_FROM_BACKSTACK = false;
        getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
        return null;
    }
    return inflater.inflate(R.layout.fragment_transactions, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);


    Log.i("FRAGMENT", "onViewCreated");
    if(view != null){

        Log.i("FRAGMENT", "ThreadStarted");
        startThread(view);
    }
}

但要小心,我会在

之后调用 onResume()
OnCreateView()

即使使用 getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();

因此,如果您有任何 conde onResume 方法,您应该妥善处理它

关于android - popBackStack导致反复调用fragment的oncreateView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22278602/

相关文章:

android - 自定义 EditText 默认光标位置

android - 使用 Android SIP Stack 的点对点 SIP 调用?

android - 当按下后退按钮或方向改变时,带 map 的 fragment 会使应用程序崩溃

android - 如何以编程方式关闭不属于当前窗口的键盘

php - PHP/CodeIgniter 有什么方法可以读取 URL,就像 site.com/#/xyz ...?

java - 字符串数组和字符串

android - 如何从 ListView 项更新 SQLite 行?

java - 从 fragment 获取 Activity 中的 View

android - 扩展 ActionBarActivity 导致错误

android - 在 fragment 第一次可见后立即执行代码