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

Dúvida sobre substituir o Frame placeholder pelo Fragment.

Nessa aula foi explicado que precisávamos substituir o comportamento anterior, que era: Ao clicar em um item da lista de provas ele chama uma nova activity DetalhesProvaActivity, pela utilização do Fragment DetalhesProvaFragment.

Minha dúvida:

Para fazer isso, na classe ListaProvasFragment, há listener para tratar o click do item da lista, onde ele troca o frame principal pelo Fragment DetalhesProvaFragment:

public class ListaProvasFragment extends Fragment {

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

        View view = inflater.inflate(R.layout.fragment_lista_provas, container, false);

        List<String> topicosPort = Arrays.asList("Sujeito", "Objeto direto", "Objeto indireto");
        Prova provaPortugues = new Prova("Portugues", "25/05/2016", topicosPort);

        List<String> topicosMat = Arrays.asList("Equacoes de segundo grau", "Trigonometria");
        Prova provaMatematica = new Prova("Matematica", "27/05/2016", topicosMat);

        List<Prova> provas = Arrays.asList(provaPortugues, provaMatematica);

        ArrayAdapter<Prova> adapter = new ArrayAdapter<Prova>(getContext(), android.R.layout.simple_list_item_1, provas);

        ListView lista = (ListView) view.findViewById(R.id.provas_lista);
        lista.setAdapter(adapter);

        lista.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Prova prova = (Prova) parent.getItemAtPosition(position);
                Toast.makeText(getContext(), "Clicou na prova de "+ prova, Toast.LENGTH_SHORT).show();

                ProvasActivity provasActivity = (ProvasActivity) getActivity();
                provasActivity.selecionaProva(prova);
            }
        });

        return view;
    }
}

Como que no método tx.replace() ele consegue encontrar o R.id.frame_principal se esse frame foi substituido no ProvasActivity? Segue codigo do ProvasActivity:

public class ProvasActivity extends AppCompatActivity {

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

        FragmentManager fragmentManager = super.getSupportFragmentManager();
        FragmentTransaction tx = fragmentManager.beginTransaction();

    // Nesse momento aqui ele nao esta substituindo o frame  principal pelo Fragment? Como então o codigo do método selecionaProva(Prova prova) consegue encontrar o mesmo R.id.frame_principal se ele já foi substituido nesse ponto?
        tx.replace(R.id.frame_principal, new ListaProvasFragment());
        if(estaNoModoPaisagem()) {
            tx.replace(R.id.frame_secundario, new DetalhesProvaFragment());
        }
        tx.commit();
    }

    private boolean estaNoModoPaisagem() {
        return getResources().getBoolean(R.bool.modoPaisagem);
    }

    public void selecionaProva(Prova prova) {
        FragmentManager fragmentManager = super.getSupportFragmentManager();
        FragmentTransaction tx = fragmentManager.beginTransaction();
    // substitui novamente algo que para mim foi tirado da tela
        tx.replace(R.id.frame_principal, new DetalhesProvaFragment());
        tx.commit();
    }
}

Sei que funciona e já testei, só queria entender o que acontece por baixo dos panos.

2 respostas
solução!

Erick, tudo bem ?

Ainda que tenha sido substituído, o que ainda está na tela é o Frame, que é um espaço em branco. Ai conseguimos fazer a alteração dele.

Espero ter ajudado.

Abraços

Valeu Matheus. Só queria entender mesmo.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software