Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Error com fragments

Estou tentando rotacionar, se exibir apenas dá certo, mas ao rotacionar a tela de um tablet com dois fragmentos dá pau:

São apresentadas as seguintes mensagens de erro:

java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.alura.estudo/br.com.alura.estudo.fragmentActivity.ProvaActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class fragment

Caused by: java.lang.IllegalStateException: Fragment br.com.alura.estudo.fragment.ProvaListaFragment did not create a view.

Activity :

package br.com.alura.estudo.fragmentActivity;


import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;

import br.com.alura.estudo.R;
import br.com.alura.estudo.fragment.ProvaListaFragment;

/**
 * Created by Fernando on 15/04/2016.
 */
public class ProvaActivity extends FragmentActivity {

    //        Log.v("ORIENTATION_PORTRAIT :", String.valueOf(Configuration.ORIENTATION_PORTRAIT));

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.provas);
        preecheLayoutConformeTela();
    }

    private void preecheLayoutConformeTela() {
        FragmentTransaction tx = getFragmentManager().beginTransaction();
        tx.replace(R.id.provas_detalhe2, new ProvaListaFragment());
        tx.replace(R.id.provas_detalhe, new ProvaListaFragment());
        tx.commit();
    }


//    private boolean layoutParaTablet() {
//        return getResources().getBoolean(R.bool.isTablet);
//    }
}

Classe do Fragment :

package br.com.alura.estudo.fragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import br.com.alura.estudo.R;
import br.com.alura.estudo.modelo.Prova;

/**
 * Created by Fernando on 15/04/2016.
 */
public class ProvaListaFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.lista_provas_view, container, false);
        ListView listaProvas = (ListView) view.findViewById(R.id.lista_provas);

        List<String> listaCobol = new ArrayList<String>();
        listaCobol.add("Sintaxe");
        listaCobol.add("Lógica");
        listaCobol.add("Conceitos");
        listaCobol.add("Le-Grava");

        List<String> listaNatural = new ArrayList<String>();
        listaNatural.add("Sintaxe");
        listaNatural.add("Lógica");
        listaNatural.add("Conceitos");
        listaNatural.add("Le-Grava");

        Prova p1 = new Prova("14/04/2016", "COBOL", "Prova de Cobol", listaCobol);
        Prova p2 = new Prova("16/04/2016", "Natural", "Prova de Natural", listaNatural);

        List<Prova> provas = Arrays.asList(p1, p2);

        final ArrayAdapter<Prova> adapter = new ArrayAdapter<Prova>(getActivity(), android.R.layout.simple_list_item_1, provas);
        listaProvas.setAdapter(adapter);

        return view;
    }
}

Xml que contem os dois fragments:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment class="br.com.alura.estudo.fragment.ProvaListaFragment"
        android:id="@+id/provas_detalhe2"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />


    <fragment class="br.com.alura.estudo.fragment.ProvaListaFragment"
        android:id="@+id/provas_detalhe"
        android:layout_weight="2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_margin="10dp"/>

</LinearLayout>

O fragment (dupliquei o mesmo para facilita):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/lista_provas"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

Alguém passou por isso?

2 respostas
solução!

Fernando, tudo bem ?

Dei uma olhadinha na sua dúvida. A exception que você está levando é devido as tags no seu XML, receio que o nome que você deu seja : provas.xml.

Bom, vamos analisar :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment class="br.com.alura.estudo.fragment.ProvaListaFragment"
        android:id="@+id/provas_detalhe2"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />


    <fragment class="br.com.alura.estudo.fragment.ProvaListaFragment"
        android:id="@+id/provas_detalhe"
        android:layout_weight="2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_margin="10dp"/>

</LinearLayout>

A tag fragment que você está utilizando no seu xml está se comportando exatamente igual a uma view comum, ela está estática na tela, quando você passa a classe para ela atráves do atributo class o próprio Android está encarregado de ir nessa classe e instanciar e colocar esse fragment no espaço que você deu para ele.

No seu código, você está pedindo para o gerenciador de Fragments substituir um espaço em branco e colocar o fragment no lugar, contudo não temos o espaço em branco, pois estamos deixando o fragment estático como uma view no layout.

O espaço em branco que eu disse é o FrameLayout, que nos permite colocar e remover fragments dentro dele.

Para resolvermos isso, a gente precisa deixar o comportamento dinâmico, onde nós possamos manipular os fragments, para podermos fazer isso vamos precisar alterar o nosso xml, trocando de fragment para FrameLayout.

Espero ter ajudado !

Abraços :)

Valeu pela resposta é exatamente isso.