У меня есть FragmentActivity
, в котором я реализую навигационный ящик, например, если я выбираю любой элемент из списка ящиков, тогда его фрагмент открывается в activity.now мой код макета xml для фрагменты дисплей выглядит следующим образомкак инициировать фрагмент в фрагменте. Активности, если он добавлен динамически.
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
, который означает, что я не какой-либо фрагмент теги в XML-файл, но я открыть фрагменты динамически деятельности, как показано ниже
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
if(session.isLoggedIn())
{
fragment = new SlidingFragment();
}
else
{
fragment = new LoginFragment();
}
break;
case 1:
fragment = new HomeFragment();
break;
case 2:
fragment = new LoginFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();}
Теперь я хочу использовать putFragment, чтобы сохранить состояние фрагмента живой для одного фрагмента wh о ориентация changed.so, я закодирован ниже по onSaveInstanceState
методы моего FragmentActivity в
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Log.v(TAG, "In frag's on save instance state ");
FragmentManager manager = getSupportFragmentManager();
fr = new RandomFragment();
manager.putFragment(outState, "randomFragment", fr);
}
здесь fr
является экземпляром фрагмента объявлен глобально Fragment fr
и RandomFragment
является фрагментом, который я называю в методе onPostExecute класса homeFragment AsyncTask. Я не знаю, инициирование RandomFragment является правильным или нет, это fr = new RandomFragment();
Потому что я не знаю, как найти фрагмент по id или тегу, потому что в моем макете активности нет тега фрагмента. У меня есть только классы фрагментов, которые расширяют фрагменты и i называть их как above.I очень запутанный here.I получает ошибку
02-28 16:28:37.809: E/AndroidRuntime(4336): java.lang.IllegalStateException: Fragment RandomFragment{4247d248} is not currently in the FragmentManager
, когда я пытаюсь изменить ориентацию landscape.I получил эту ошибку в putFragment Line.And в onRestoreInstanceState методы я пишу код для getFragment
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction t = manager.beginTransaction();
if(savedInstanceState != null)
{
fr = (FragmentRandom)manager.getFragment(savedInstanceState, "randomFragment");
}
else
{
fr = new FragmentRandom();
}
t.add(fr, "randomFragment");
t.commit();
}
Но когда putFrag на onSaveInstanceState
выполняется в тот момент, когда я получаю ошибку, и мое приложение перестает действовать так, что onRestoreInstanceState
не выполняется. Моя фактическая проблема - я не знаю, что я инициирую фрагмент правильным способом или нет. И если это правильно, то почему я получаю ошибку. Должен ли я что-либо делать с onSaveInstanceState
методом фрагмента. Пожалуйста, помогите мне, я застрял здесь через полтора дня, я прочитал все вопросы, связанные с этим здесь, но я до сих пор не могу понять, какая помощь будет оценена.
я попробовал ваш код спасибо Фро ответ, но он дает фрагмент добавляемые настроек уже, не в состоянии возобновить деятельность –
я бы сказал, что это потому, что вы вызываете 't.add (фр,«randomFragment»);' в onResumeInstanceState вместо 't.replace' –
ok проблема решена путем замены add для замены. –