8
respostas

Manter Fragment ao rotacionar a tela

Olá pessoal, quando eu seleciono a prova e aparece o fragment contendo os detalhes da prova (tópicos), se por acaso eu rotacionar a tela, o fragment com os detalhes da prova fica em branco novamente aguardando eu selecionar uma prova. Como posso fazer, para que ao rotacionar a tela, eu mantenha o fragment preenchido? Tentei usar o savedInstance com restoreInstance mas aparentemente o fragment nao possui o restoredInstance. E se possível, vi sobre um framework que chama Icepick, posso usar ele com fragments?

8 respostas

Fala ai Jilles, de boa ?

O Fragment também tem um método onCreate, que recebe um bundle por parametro, que é o mesmo que você salva o estado.

Tá, o correto então seria eu salvar o estado direto no fragment msm, não na activity?

Depende.

Para salvar os dados do fragment, faz sentido salvar nele.

Se precisar salvar algo na activity terá que fazer nela.

Por exemplo, seu fragment precisa segurar o objeto que tá dentro dele, aí é necessário voce salvar.

Mas sua activity precisa salvar a pilha de exibição, que por padrão já é automatico, você só precisa saber se já tem algo, que é o conteudo do Bundle do oncreate da activity.

Não estou conseguindo implementar hehe. Vamos lá, eu estou exibindo um fragment que contem uma lista de objetos e, ao virar a tela, esse fragment é destruido. Então preciso salvar no onSaveInstanceState(Bundle outState) do próprio fragment as informações. Porém ele não aceita um List no bundle. Como proceder?

Trabalha com arraylist

Pelo que vi, deveria implementar Parcelable e não serializable kkkk Vou tentar converter para ver o que consigo

Não tem necessidade não.

opa, ressuscitando esse tópico aqui hehe, seguinte estou criando meu app aki, e tenho 4 fragments em meu aplicativo de receitas:

1 - Lista de Receitas Fragment, que exibe a lista com todas receitas

2 - Ingredientes Fragment - que exibe os ingredientes da receita selecionada;

3 - Passos Fragment - que exibe os passos a passo da receita selecionada;

4 - VideoFragment - que vai exibir meus vídeos.Meu problema está sendo na alteração do modo Portrait para Landscape, se estou no modo portrait e meu fragment Ingredientes esta sendo exibido, por exemplo, ao rotacionar a tela, gostaria que o fragment continuasse sendo exibido.

Minha activity no modo landscape possui dois fragments(Master detail) onde o primeiro frame layout eh substituido pela lista de receitas, e o segundo entraria os "detalhes", como por exemplo a lista de ingredientes selecionados

Quando o usuario clica no botao para ver as receitas, eu passo como parametro em um bundle todos os ingredientes, e no onSaveInstance da activity eu salvo o fragment para recuperar no metodo onCreate().

Até ae tudo bem, mas quando entro para recuperar ela, me aparece essa bendita mensagem:

java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.agilles.receitas/br.com.agilles.receitas.ui.activity.ReceitasActivity}: java.lang.IllegalStateException: Can't change container ID of fragment IngredientesFragment{7e63862 #1 id=0x7f070050}: was 2131165264 now 32156489

Estou fazendo da seguinte maneira no meu onSaveInstanceState:

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        switch (fragmentoExibido) {
            case RECEITA_INGREDIENTES:
                getSupportFragmentManager().putFragment(outState, INGREDIENTE_TAG, ingredientesFragment);
                outState.putInt("fragmentoExibido", fragmentoExibido);
                break;
            case RECEITA_PASSOS:
                getSupportFragmentManager().putFragment(outState, PASSOS_TAG, passosFragment);
                outState.putInt("fragmentoExibido", fragmentoExibido);
                break;

        }
    }

e para recuperar e exibir o fragment na minha tela master / detail:

 FragmentManager supportFragmentManager = getSupportFragmentManager();
        FragmentTransaction tx = supportFragmentManager.beginTransaction();
        tx.replace(R.id.frame_principal, listaReceitasFragment);

        if (savedInstanceState != null) {
            if (ingredientesFragment != null) {
                ingredientesFragment = new IngredientesFragment();
            }
            tx.replace(R.id.frame_principal, listaReceitasFragment);
            fragmentoExibido = savedInstanceState.getInt("fragmentoExibido");

            ingredientesFragment = (IngredientesFragment) getSupportFragmentManager().getFragment(savedInstanceState, INGREDIENTE_TAG);
            passosFragment = (PassosFragment) getSupportFragmentManager().getFragment(savedInstanceState, PASSOS_TAG);

            if (estaNoModoPaisagem()) {
                switch (fragmentoExibido) {
                    case RECEITA_INGREDIENTES:
                        tx.replace(R.id.frame_secundario, ingredientesFragment);
                        break;
                    case RECEITA_PASSOS:
                        tx.replace(R.id.frame_secundario, passosFragment);
                        break;
                    default:
                        tx.replace(R.id.frame_secundario, new IngredientesFragment());
                }
            }

Alguma luz?