Фрагмент Транзакция загружает пустой вид, но фрагмент отображается после вращения устройства
Я создаю ящик для навигации, как это предусмотрено документацией Google, однако у меня есть проблема, когда фрагмент не заменяется. http://developer.android.com/training/implementing-navigation/nav-drawer.html
Когда приложение загружается первым, загружается фрагмент по умолчанию.
Нажатие на другой элемент в списке ящиков оставляет пустой вид
Однако при вращении устройства загружается выбранный фрагмент.
public void selectNavActivty(int position){
// TODO Changing between the different screens selection
fragment = null;
switch (position) {
case 0:
fragment = OverLay.newInstance();
break;
case 1:
fragment = Dummy.newInstance();
break;
}
if(fragment != null) {
// attach added to handle viewpager fragments
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.content_frame, fragment).attach(fragment)
.addToBackStack(null);
trans.commit();
getFragmentManager().executePendingTransactions();
} else {
Log.d("Drawer Activity","Error in creating Fragment");
}
}
Ответы
Ответ 1
Для транзакций фрагмента меню навигации я использую следующий подход, таким образом фрагмент будет добавлен и помещен сверху.
String name = "myFragment";
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment, name)
.commit();
Посмотрите функцию attach(). Он следует за другим жизненным циклом фрагмента.
Также убедитесь в том, что вы можете отобразить рамку в макете.
Ответ 2
Измените свой код, как показано ниже:
if(fragment != null) {
// attach added to handle viewpager fragments
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.content_frame, fragment);
trans.addToBackStack(null);
trans.commit();
} else {
Log.d("Drawer Activity","Error in creating Fragment");
}
Если решение не работает для вас, поделитесь xml-кодом вместе с кодом фрагмента.
Ответ 3
После добавления фрагмента он будет добавлен в состояние активности и его вид будет добавлено к определенному представлению контейнера. Но, добавив ничего, отображается, если фрагмент еще не добавлен в пользовательский интерфейс. Он просто придает менеджер фрагментов. Однако если представление уже было добавлено в контейнер в пользовательском интерфейсе и отсоединенный после этого, путем присоединения, он будет отображаться снова в его контейнере. Наконец, вы можете использовать прикрепление и отсоединение, если хотите уничтожить фрагмент Просмотр временно и хотите отобразить и построить его взгляд на будущее, не теряя своего состояния внутри деятельности.
fooobar.com/questions/261565/...
Ответ 4
Мое решение - пометить весь фрагмент уникальным тегом при замене фрагмента. Убедитесь, что вы также назначили уникальный тег для фрагмента по умолчанию во время создания. Более эффективный способ состоит в том, чтобы идентифицировать фрагмент, прежде чем воссоздать один и тот же.
public void selectNavActivty(int position){
// TODO Changing between the different screens selection
FragmentManager fragmentManager = getSupportFragmentManager();
fragment = fragmentManager.findFragmentById(R.id.content_frame);
String fragmentTag = null;
switch (position) {
case 0:
fragmentTag = "case0Tag"; // please change to better tag name
break;
case 1:
fragmentTag = "case1Tag"; // please change to better tag name
break;
default:
Log.d("Drawer Activity","Error in creating Fragment");
return;
}
if (fragmentTag != null && !fragment.getTag().equals(fragmentTag))
fragmentManager.beginTransaction().replace(R.id.content_fragment, fragment, tag).commit();
}