2017-02-20 6 views
1

У меня есть проект приложения, где есть 10 фрагментов. Когда пользователь открывает фрагмент, который я хочу в коде, знаю это и сохраняю фрагмент в качестве последнего пользователя фрагмента.Как определить, какой фрагмент используется в данный момент

Если пользователь закрыл приложение и снова открыл его, этот последний посетивший фрагмент будет показан пользователю.

Я прочитал много ответов об этом, и там нет шва, чтобы быть консенсусом относительно решения узнать, что Фрагмент в настоящее время отображается для пользователя.

Я думал, что подкласс FragmentManager, возможно, обнаружит состояние popping и monitor queue.

Или, может быть, положить GestureDetector.OnGestureListener в Fragment, и когда это произойдет, я смогу сохранить последний посетитель Fragment.

Любая помощь по этому вопросу будет натереть

Это то, что происходит, когда пользователь в пресс нажать кнопку обратно Фрагмент

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

В коде выше я поп фрагмент и не знаю, что фрагмент находится под popt Fragment.

Вот когда я добавить или показать фрагмент

/** 
    * 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', потому что я не хочу, чтобы Фрагменты перезагружались, теряя состояние –

 Смежные вопросы

  • Нет связанных вопросов^_^