2017-05-09 94 views
1

我有三個片段:刪除片段問題

A是我的主要片段,B是登錄片段,成功登錄後會進入C片段。

當我點擊後退按鈕,我需要從片段下移到片段A

我的問題是,當我點擊後退按鈕我仍然片段B-片段從A.

移動

我該如何解決我的問題?

這是我的開關片段功能:

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

片段(NewHomepage)到B(LoginFragment)片段:

switchFragment(LogInFragment.newInstance()); 

這是我的乙片段,它具有值logged來決定當它來自C片段時,是否切換片段。

我認爲這個問題一定是在這裏,當回到A片段並點擊返回按鈕想要退出APP時,我可以看到logcat show 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 MainActivity:

@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時,我必須點擊兩次以顯示警報對話框,我不知道當我在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和使用上switchFragment manager.popBackStack();,這個問題將是固定的。

+3

的可能的複製[如何刪除從Android的後退堆棧特定片段(http://stackoverflow.com/questions/31198894/how-to-delete-a-specific-fragment-from-back -stack-in-android) – Tauqir

+0

嘿,謝謝你的幫助,我可以從你的鏈接找到答案。非常感謝你。 –

回答

1

嘗試

它會顯示片段,如果它已被添加。

使用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(); 
} 
+0

感謝您的代碼人,那麼這是否意味着當C到A只是在您的代碼中隱藏B時? –

+0

它會隱藏B it oldFragment引用B – Pehlaj

+0

是的,當你從B切換到另一個片段時,它隱藏了B – Pehlaj