2015-02-28 5 views
0

У меня есть 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 методом фрагмента. Пожалуйста, помогите мне, я застрял здесь через полтора дня, я прочитал все вопросы, связанные с этим здесь, но я до сих пор не могу понять, какая помощь будет оценена.

ответ

0

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

@Override 
protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    FragmentManager manager = getSupportFragmentManager(); 
    Fragment fr = manager.findFragmentById(R.id.frame_container); 
    manager.putFragment(outState, "randomFragment", fr); 
} 
+0

я попробовал ваш код спасибо Фро ответ, но он дает фрагмент добавляемые настроек уже, не в состоянии возобновить деятельность –

+0

я бы сказал, что это потому, что вы вызываете 't.add (фр,«randomFragment»);' в onResumeInstanceState вместо 't.replace' –

+0

ok проблема решена путем замены add для замены. –

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