2013-07-15 5 views
0

Об изменении конфигурации я делаю это в моем FragmentActivity onSaveInstanceState:Как восстановить (Sherlock) FragmentActivity к нераспределенной фрагмента после изменения ориентации

getSupportFragmentManager().putFragment(outState,"fred",fred); 

где Фреда мой setRetainInstance (истина), фрагмент.

Тогда в моем FragmentActivity onRestoreInstanceState я это делаю:

fred = getSupportFragmentManager().getFragment(inState,"fred"); 

согласно рекомендаций в этом вопросе: When to use FragmentManager::putFragment and getFragment

где Фреда определен глобально, как это:

android.support.v4.app.Fragment fred=null; 

Я хочу вызовите метод в fred из другого метода в моей FragmentActivity (т. е. не из onRestoreInstanceState), который мне нравится:

((fred) fred).somemethod(); 

, который отлично работает перед изменением ориентации. Однако после изменения ориентации я сталкиваюсь с classCastExceptions, в которых упоминаются другие фрагменты внутри моей FragmentActivity (harry, bert и т. Д.). Причина этих ошибок заключается, вероятно, в том, что Fragment Manager был использован для прикрепления/отсоединения фрагментов harry и bert ПОСЛЕ onRestoreInstanceState.

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

fred fragment = (fred) getSupportFragmentManager().findFragmentByTag("fred"); 

непосредственно перед вызовом метода в Фреде. Однако все, что я пытаюсь, просто возвращает null.

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

Обновление: я не реализовал принятое решение точно, но он заставило меня понять, что мне нужно было создать экземпляр fred, даже если это сохранившийся фрагмент. то есть то, что я на самом деле решить это, чтобы выполнить мой вызов метода, как это:

fred fragment = (fred) getSupportFragmentManager().findFragmentByTag("fred"); 
    if (fragment==null){ 
     fragment = new fred();    //this is what I had been missing 
    } 

    ((fred) fred).somemethod(); 
+0

вы фрагмент Фреда создан в коде (fragmentTransaction) Do или находится в xml-макете? – koso

+0

В настоящее время это код, но я также попробовал xml. – IanB

ответ

1

Вы можете сделать что-то вроде этого:

android.support.v4.app.Fragment fred = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    FragmentManager fm = getFragmentManager(); 
    fred = (TaskFragment) fm.findFragmentByTag("fredFrag"); 

    // if fred is null it means it is first time created activity 
    // so we add fragment to activity 
    // else fragment was added to activity and is 
    // retained across a configuration change. 
    if (fred == null) { 
     fred = new Fragment(); 
     fm.beginTransaction().add(mTaskFragment, "fredFrag").commit(); 
    } 
} 
+0

Мне не приходило в голову, что мне понадобится снова создать fred (= new) для сохраненного фрагмента. Ошибка школьника с моей стороны - большое спасибо! – IanB

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