Android 删除碎片问题

Android 删除碎片问题,android,android-fragments,Android,Android Fragments,我有三个片段: A是我的主片段,B是登录片段,成功登录将进入C片段 当我点击后退按钮时,我需要从片段C移动到片段A 我的问题是,当我点击后退按钮时,我仍然从片段A移动到片段B 如何解决我的问题 下面是我的开关片段函数: public void switchFragment(Fragment fragment) { FragmentManager manager = getActivity().getSupportFragmentManager(); FragmentTransac

我有三个片段:

A是我的主片段,B是登录片段,成功登录将进入C片段

当我点击后退按钮时,我需要从片段C移动到片段A

我的问题是,当我点击后退按钮时,我仍然从片段A移动到片段B

如何解决我的问题

下面是我的开关片段函数:

public void switchFragment(Fragment fragment) {
    FragmentManager manager = getActivity().getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.mainFrame, fragment, null);
    transaction.addToBackStack(null);
    transaction.commit();
}
A片段(新主页)到B片段(登录片段):

switchFragment(LogInFragment.newInstance());
这是我的B片段,它具有值
logged
,用于决定是否切换来自C片段的片段

我认为问题一定在这里,当返回到片段并单击“上一步”按钮想要退出应用程序时,我可以看到logcat显示1=>和2=>

String logged = memberData.getUD_MBTYPENAME(); //get the value when login succeed 
        Log.d(TAG,"1=>"+logged);
        //If UD_MBTYPENAME is not null,change to A fragment
        if (!TextUtils.isEmpty(logged)) {
            Log.d(TAG,"2=>"+logged);
            ((MainActivity) getActivity()).switchFragment(NewHomepage.newInstance());
        }
以下是我关于onKeyDown和switchFragment的主要活动:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
            quickDialog();//It's a alert dialog
            return false;
        }
    }
    return super.onKeyDown(keyCode, event);
}

public void switchFragment(Fragment fragment) {
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.mainFrame, fragment, null);
    transaction.addToBackStack(null);
    transaction.commit();
}
如果我不使用
transaction.addToBackStack(null),请引用如下更改代码,问题仍然存在,即使删除
transaction.addToBackStack(null)

当我返回A时,我必须单击两次返回以显示警报对话框,我不知道在片段中第一次单击返回时发生了什么

if (!TextUtils.isEmpty(logged)){
        Log.d(TAG,"2=>"+logged);

        hideFragment(LogInFragment.newInstance());
        switchFragment(NewHomepage.newInstance());
    }

public void switchFragment(Fragment fragment) {
    FragmentManager manager = getActivity().getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.mainFrame, fragment, null);
    //remove it will fix my issue , but I have to click back twice to show alert dialog , I don't know what happened click it first time in A fragment.
    //transaction.addToBackStack(null);
    transaction.commit();
}

public void hideFragment(Fragment fragment) {
    FragmentManager manager = getActivity().getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.hide(fragment);
    transaction.commit();
}
删除
hideFragment
并使用
manager.popBackStack()在switchFragment上,问题将得到解决。

尝试

如果已经添加了片段,它将显示该片段

使用
fragmentTransaction.show
方法重新使用现有片段,即保存的实例

public void switchFragment (Fragment oldFragment, Fragment newFragment, int frameId) {

    boolean addFragment = true;

    FragmentManager fragmentManager = getFragmentManager ();
    String tag = newFragment.getArguments ().getString ("TAG");
    Fragment fragment = fragmentManager.findFragmentByTag (tag);

    // Check if fragment is already added
    if (fragment != null && fragment.isAdded ()) {
        addFragment = false;
    }

    // Hide previous fragment
    String oldFragmentTag = oldFragment.getArguments ().getString (BaseFragment.TAG);

    if (!tag.equals (oldFragmentTag)) {
        FragmentTransaction hideTransaction = fragmentManager.beginTransaction ();
        Fragment fragment1 = fragmentManager.findFragmentByTag (oldFragmentTag);
        hideTransaction.hide (fragment1);
        hideTransaction.commit ();
    }

    // Add new fragment and show it
    FragmentTransaction addTransaction = fragmentManager.beginTransaction ();

    if (addFragment) {
        addTransaction.add (frameId, newFragment, tag);
        addTransaction.addToBackStack (tag);
    }
    else {
        newFragment = fragmentManager.findFragmentByTag (tag);
    }

    addTransaction.show (newFragment);

    addTransaction.commit ();
}

可能重复嘿谢谢你的帮助,我可以从你的链接找到答案。非常感谢。感谢你的代码管理员,那么这是否意味着在我的例子中,当C到A只是从你的代码中隐藏B?它将隐藏B it oldFragment指的是,当你从B切换到另一个片段时,它隐藏B感谢你的响应,但我发现如果我不删除
transaction.addToBackStack(null),即使我使用“隐藏”或“不隐藏”,问题也不会得到解决。我已经更新了这个问题。