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.