2017-05-09 43 views
1

を削除します。私は3つの断片持つフラグメントの問題

Aは私のメインのフラグメントであるが、Bは、成功したログインがCフラグメントを入力し、ログイン断片です。私は戻るボタンをクリックして、私は断片C.からのフラグメントAへ

を移動する必要が私の問題は、私は戻るボタンをクリックしたとき、私はまだフラグメントA.

から断片Bに移動し、ということである

問題を解決するにはどうすればよいですか?ここで

は私のスイッチフラグメント機能である:B(LoginFragment)フラグメントへ

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):

switchFragment(LogInFragment.newInstance()); 

これは私のB断片である、それは決定する値loggedを持っていますスイッチはC断片から来たときに断片かどうかを判断します。

私はその問題がここになければならないと思う、フラグメントに戻って戻るボタンをクリックするとAPPを終了したいと思う、私は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についての私の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に戻ると、警告ダイアログを表示するために2回クリックする必要があります。フラグメントの最初の部分をクリックすると何が起こったのか分かりません。

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

可能な重複(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を元に戻しますoldFragmentはBを参照しますB – Pehlaj

+0

はい、Bから別のフラグメントに切り替えると、B – Pehlaj

関連する問題