Intereting Posts
В Android, как изменить цвет конкретной буквы / символа, который выполняется в списке в списке ActionBarSherlock – тип android.support.v4.app.Fragment не может быть разрешен. Это косвенно ссылается на требуемые файлы .class ADB не запускается (сообщение об ошибке отсутствует) Значение мигающей красной границы в эмуляторе Android TabWidget обнаружит щелчок на текущей вкладке Android – использование метода из службы в действии? Как обрабатывать ошибки API в Android-приложении, используя Facebook 3.0 SDK? Как выполнить действие после щелчка по нажатой кнопке DialogFragment Уведомление о контакте в верхней части области уведомлений Кинжал 2, вводящий несколько экземпляров одного и того же типа объекта GetWidth () и getHeight () всегда возвращает 0. Пользовательский вид Содержимое Android-сообщества Android Facebook не показано на главной странице Android Google Maps v2, MAP_TYPE_NONE и черные квадраты Android: java.io.IOException: неправильная версия хранилища ключей Преобразование в формат Dalvik завершилось ошибкой с ошибкой 1 со страшным сообщением в представлении «Консоль»

Принесите фрагмент на фронт (без фрагментального отдыха)

У меня есть три фрагмента F1 F2 F3 F4, все из которых доступны из боковой панели.

Все четыре могут быть вызваны в любое время и в любом порядке,

Теперь я хочу, если F1 уже щелкнул (создал), а затем никогда больше не создавал F1, а возвращал фрагмент F1 на передний план с помощью диспетчера фрагментов. То же самое для всего остального фрагмента

Пока я пробовал это для каждого фрагмента в моем контейнере (ФРАГМЕНТНАЯ ДЕЯТЕЛЬНОСТЬ)

if (fragmentManager.findFragmentByTag("apps")==null) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); Fragment newFragment = new CategoriesFragment(); transaction.replace(R.id.content_frame, newFragment, "apps"); transaction.addToBackStack("apps"); transaction.commit(); } else{ } 

If часть гарантирует, что NO фрагмент не будет воссоздан (если он уже создан) снова, но что я должен писать в else части, так что уже созданный фрагмент может быть перенесен на передний план в View Hierarchy

Пожалуйста, помогите, я застрял на этом в течение 2 дней.

Solutions Collecting From Web of "Принесите фрагмент на фронт (без фрагментального отдыха)"

Я бы поместил этот код в класс активности, который должен иметь FrameLayout с id R.id.fragment_container .

 private Fragment1 F1; private Fragment2 F2; private Fragment3 F3; private Fragment4 F4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); F1 = new Fragment1(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F1).commit(); F2 = new Fragment2(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F2).commit(); F3 = new Fragment3(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F3).commit(); F4 = new Fragment4(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F4).commit(); //if needed show F1 getSupportFragmentManager().beginTransaction().show(F1).commit(); } , private Fragment1 F1; private Fragment2 F2; private Fragment3 F3; private Fragment4 F4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); F1 = new Fragment1(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F1).commit(); F2 = new Fragment2(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F2).commit(); F3 = new Fragment3(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F3).commit(); F4 = new Fragment4(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F4).commit(); //if needed show F1 getSupportFragmentManager().beginTransaction().show(F1).commit(); } 

И добавьте это для нажатия кнопки:

 public void onBtnClick(View view){ if(mShowF1){ getSupportFragmentManager().beginTransaction().show(F1).commit(); getSupportFragmentManager().beginTransaction().hide(F2).commit(); getSupportFragmentManager().beginTransaction().hide(F3).commit(); getSupportFragmentManager().beginTransaction().hide(F4).commit(); } //... } , public void onBtnClick(View view){ if(mShowF1){ getSupportFragmentManager().beginTransaction().show(F1).commit(); getSupportFragmentManager().beginTransaction().hide(F2).commit(); getSupportFragmentManager().beginTransaction().hide(F3).commit(); getSupportFragmentManager().beginTransaction().hide(F4).commit(); } //... } 

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

ПРИМЕЧАНИЕ (@ developer1011): для использования после операции сохранить состояние вызова commitAllowingStateLoss () . Используйте с осторожностью, потому что фрагмент не восстанавливается с восстановлением активности.

ПРИМЕЧАНИЕ. MainActivity должен реализовать OnFragmentInteractionListener для каждого фрагмента.

 public class MainActivity extends FragmentActivity implements Fragment1.OnFragmentInteractionListener, Fragment2.OnFragmentInteractionListener, Fragment3.OnFragmentInteractionListener, Fragment4.OnFragmentInteractionListener {//.. @Override public void onFragmentInteraction(Uri uri) { // } } 

Получите фрагмент по тегу и замените его в контейнере,

 else{ Fragment existingFragment = (CategoriesFragment)fragmentManager.findFragmentByTag("apps"); transaction.replace(R.id.content_frame,existingFragment, "apps"); transaction.addToBackStack("apps"); transaction.commit(); } 

ОБНОВЛЕНИЕ: вы можете использовать скрытый и демонстрационный фрагмент, чтобы избежать отдыха. Вместо использования «transaction.replace ()»

 fragmentTransaction.hide(<oldFragment>); fragmentTransaction.show(<newFragment>); 
  1. Используйте простой ArrayList<Fragment> для ваших фрагментов и добавьте их в порядок, чтобы вы знали, что get (0) получит F1, get (1) получит F2 и т. Д.

  2. Создайте фрагменты как одиночные. В каждом фрагменте добавьте статическое поле и метод:

      private static Fragment mMyInstance = null; public static Fragment newInstance() { if (mMyInstance == null) { mMyInstance = new F1(); } return mMyInstance; } 
  3. Создайте фрагменты со статическим методом и добавьте их в ArrayList.

  4. В каждом фрагменте добавьте setRetainInstance(true); Команду для метода onCreate ().

Теперь, когда вы добавляете фрагмент с помощью FragmentManager, onCreate() только в первый раз, но onCreateView() будет вызываться каждый раз. Вы хотите раздуть представление и подключить виджеты каждый раз, только если ваша активность была восстановлена ​​из-за изменения конфигурации. Но вы можете проверить что-то, что вы добавите, чтобы увидеть, было ли это в первый раз или нет, и сбросить виджеты до их предыдущего состояния, если нет. Таким образом, вам понадобятся переменные-члены в ваших фрагментах, чтобы отслеживать их состояние. Переопределите onStop (), чтобы сохранить состояние и повторно применить его в onCreateView () после подключения виджетов.

Затем, когда нажата кнопка боковой панели, вы получаете фрагмент, соответствующий этой кнопке, удалите предыдущий фрагмент и добавьте текущий с помощью FragmentManager (или просто используйте команду replace () вместо remove () / add ()) ,

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

  /** * Takes a Fragment TAG and tries to find the fragment in the manager if it exists and bring it to front. * if not, will return false; * @param manager * @param tag */ public static boolean resurfaceFragment(FragmentManager manager, String tag ){ Fragment fragment = manager.findFragmentByTag(tag); FragmentTransaction transaction = manager.beginTransaction(); if (fragment!=null){ for (int i = 0; i < manager.getFragments().size(); i++) { Fragment f = manager.getFragments().get(i); transaction.hide(f); } transaction.show(fragment).commit(); return true; } return false; } 

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

 public static void attachFragment ( int fragmentHolderLayoutId, Fragment fragment, Context context, String tag ) { FragmentManager manager = ( (AppCompatActivity) context ).getSupportFragmentManager (); manager.findFragmentByTag ( tag ); FragmentTransaction ft = manager.beginTransaction (); if (manager.findFragmentByTag ( tag ) == null) { // No fragment in backStack with same tag.. ft.add ( fragmentHolderLayoutId, fragment, tag ); ft.addToBackStack ( tag ); ft.commit (); } else { ft.show ( manager.findFragmentByTag ( tag ) ).commit (); } }