2017-02-20 9 views
1

私は、10個のフラグメントがあるアプリケーションプロジェクトを持っています。ユーザが「フラグメント」を開くときに、これを知っているコードを知って、最後のフラグメントとしてユーザが訪れたフラグメントを保存します。現在使用中のフラグメントを検出する方法

ユーザーがアプリを終了してもう一度開いた場合は、この最後にアクセスされたFragmentがユーザーに表示されます。

私はこれに関する多くの回答を読んでいますが、ユーザーにとって現在どのようなFragmentが表示されているかを知るための解決策については一致していません。

FragmentManagerをサブクラス化して、ポップアップを検出し、キューの状態を監視する可能性があります。

FragmentGestureDetector.OnGestureListenerを入れて、最後にユーザーが訪れた最後のフラグメントを保存することができます。

この上の任意のヘルプは、火格子

だろうこれは、バックフラグメントプレスにおけるユーザー押しボタンコードで

/** 
    * user press back button 
    */ 
    @Override 
    public void onBackPressed() { 
     //Fragment fragment = getVisibleFragment(); 

     //get the name from the topmost BackStackEntry which is also the fragment tag. 
     String fragmentTag = mFragManager.getBackStackEntryAt(mFragManager.getBackStackEntryCount()-1).getName(); 

     Fragment currentFrag = mFragManager.findFragmentByTag(fragmentTag); 
     if (currentFrag == null) { 
      super.onBackPressed(); 
     } 

     if (currentFrag != null) { 
      if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.CHAT_FRAGMENT.toString())) { 
       if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { 
        openDrawer(false); 
       } else 
        requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.BILLBOARD_FRAGMENT.toString())) { 

      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.NEWS_FRAGMENT.toString())) { 

      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.INFO_FRAGMENT.toString())) { 
       super.onBackPressed(); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.SEARCH_FRAGMENT.toString())) { 
       // exit app if the search address view is visible 
       if (currentFrag.getView().findViewById(R.id.search_address_layout).getVisibility() == View.VISIBLE) { 
        exitApp(); 
       } else if (currentFrag.getView().findViewById(R.id.show_search_result_layout).getVisibility() == View.VISIBLE) { 
        // show search address view if Address already exist view is visible 
        currentFrag.getView().findViewById(R.id.search_address_layout).setVisibility(View.VISIBLE); 
        currentFrag.getView().findViewById(R.id.history).setVisibility(View.VISIBLE); 
        currentFrag.getView().findViewById(R.id.show_search_result_layout).setVisibility(View.INVISIBLE); 
        ((SearchFragment)currentFrag).onSearchLayoutVisible(); 
       } 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT.toString())) { 
       super.onBackPressed(); 
       //requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT_CHAT_SETTINGS.toString())) { 
       super.onBackPressed(); 
       //requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.PREFERENCE_FRAGMENT_THEME_SETTINGS.toString())) { 
       super.onBackPressed(); 
       //requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } else if (currentFrag.getTag().equals(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString())) { 
       super.onBackPressed(); 
       //requestBeginTransaction(SettingsManager.FragmentsModel.LAUNCHER_FRAGMENT.toString(), true, false); 
      } 
     } else 
      exitApp(); 
    } 

iはフラグメントをポップし、フラグメントが下にあるものを知らない上場合に発生するものですpoptフラグメント。私はあなたは、そのインスタンスを見て、それをテストすることができます追加またはフラグメント

/** 
    * Change the current displayed fragment by a new one. 
    * - if the fragment is in backstack, it will pop it 
    * - if the fragment is already displayed (trying to change the fragment with the same), it will not do anything 
    * 
    * @param backStateName    the new fragment to display 
    * @param saveInBackstack if we want the fragment to be in backstack 
    * @param animate   if we want a nice animation or not 
    */ 
    public void requestBeginTransaction(String backStateName, boolean saveInBackstack, boolean animate) { 
     Fragment frag = null; 
     if (mFragManager.findFragmentByTag(backStateName) != null) { 
      frag = mFragManager.findFragmentByTag(backStateName); 
     } else 
      try { 
       frag = (Fragment) Class.forName(backStateName).newInstance(); 
      } catch (InstantiationException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 
     try { 
      FragmentManager manager = getSupportFragmentManager(); 
      boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0); 

      if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) { 
       //fragment not in back stack, create it. 
       FragmentTransaction transaction = manager.beginTransaction(); 

       if (animate) { 
        LogManager.d(this, "Change Fragment: animate"); 
        // transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right); 
       } 

       transaction.add(R.id.frame, frag, backStateName); 

       if (saveInBackstack) { 
        LogManager.d(this, "Change Fragment: addToBackTack " + backStateName); 
        transaction.addToBackStack(backStateName); 
        LogManager.d(this, "Change Fragment: NO addToBackTack"); 
       } 

       transaction.commit(); 
      } else { 
       mFragManager.beginTransaction().show(mFragManager.findFragmentByTag(backStateName)).commit(); 

       // custom effect if fragment is already instanciated 
      } 
     } catch (IllegalStateException exception) { 
      LogManager.w(this, "Unable to commit fragment, could be activity as been killed in background. " + exception.toString()); 
     } 
    } 
+0

isAttached()をチェックできます。 – AnixPasBesoin

答えて

1

を表示したときにここで

です。

Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment_container); 
if (fragment instanceOf Fragment1) { 
// It is fragment of class Fragment1 
} else if (fragment instanceOf Fragment2) { 
// It is fragment of class Fragment2 
} 

ユーザーがボタンを背中押すと、お使いのactivity(ないフラグメント)でこれを持っている:

@Override 
public void onBackPressed() { 

    super.onBackPressed(); 

    Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment_container); 
    if (fragment instanceOf Fragment1) { 
    // It is fragment of class Fragment1 
    } else if (fragment instanceOf Fragment2) { 
    // It is fragment of class Fragment2 
    } 

    // Save to prefs which fragment tag it is 
} 
+0

これを断片の中で呼ぶべきであることを意味しますか? naaこのコードはいつ実行する必要がありますか? –

+0

が更新されました。これを行うだけで、どの断片であるかを確認することができます。 – zed

+0

それ以外の場合は、次のようにします。http://stackoverflow.com/questions/9294603/get-currently-displayed-fragment – zed

0

あなただけのユーザーがアプリを閉じた場合、それを復元するために、最後の目に見えるの断片を知る必要がある場合、私は単にそれが開始されるときに、SharedPreferencesにフラグメントのタグ(または何らかの識別子)を格納することを提案します。その後、そのプリファレンス値を使用して、アプリケーションの起動時に正しいフラグメントを設定することができます。 これは、onStart()フラグメントメソッドをオーバーライドすることで実行できます。

+0

をありがとう。私はフラグを追加するときに 'transaction.add'を使用しません。 –

関連する問題