Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro ao instanciar view com vários fragments

Estou no vídeo 4 da aula 2, tentando criar a tela horizontal de detalhes de provas usando fragments. O app compila e roda, mas quando clico no botão para ir até a lista de provas, recebo um erro.

 Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f07003e (br.com.alura.agenda:id/frame_secundario) for fragment DetalhesProvaFragment{e5ddae7 #1 id=0x7f07003e}

Ou seja, o Java não consegue achar a view gerada para o ID especificado para o fragment que passei como parâmetro. Refiz a aula 2 vezes já e procurei extensivamente meu erro, mas até agora, sem solução. Procurei em outros fóruns, muitos recomendam usar a função getChildFragmentManager() mas tal método não é reconhecido pelo Android Studio. Também vi recomendações para usar o getFragmentManager() no lugar do getSupportFragmentManager(), entretanto, preciso fazer vários parsings e correções visto que usamos a biblioteca de suporte do fragment desde o início.

Estou sem ideias já, pelo que pude entender das minhas buscas online, tem algo a ver com os fragments estarem aninhados, mas não sei como consertar.

Aqui estão meu ProvasActivity.java , acitivity_provas.xml (land) e DetalhesProvaFragment.java respectivamente.

package br.com.alura.agenda;

import android.content.Intent;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

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

import br.com.alura.agenda.modelo.Prova;

public class ProvasActivity extends AppCompatActivity {

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

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction tx = fragmentManager.beginTransaction();
        //Replace substitui um frame layout por um fragment
        tx.replace(R.id.frame_principal, new ListaProvasFragment());
        tx.replace(R.id.frame_secundario, new DetalhesProvaFragment());
        tx.commit();
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="horizontal"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:id="@+id/frame_principal"></FrameLayout>

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:id="@+id/frame_secundario"></FrameLayout>

</LinearLayout>
package br.com.alura.agenda;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class DetalhesProvaFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_detalhes_prova, container, false);
        return view;
    }

}
1 resposta
solução!

Acho que descobri o erro. Estava tocando no botão de mostrar as provas com o celular em modo retrato, mas se fizer em modo paisagem, funciona. Achei que o Android distinguia automaticamente ou simplesmente não mostrava a view se o layout não tivesse o FrameLayout com ID especificado. Na aula, o instrutor carrega o código já com o emulador em modo paisagem, então não ficou muito claro isso. Vou finalizar essa parte do curso para ter certeza e vou marcar o post como resolvido assim que terminar.