Ho una semplice app che ha due frammenti e in modalità orizzontale entrambi i frammenti sono affiancati e in verticale mostro Frammento A e se selezionano un'opzione, avvia un'attività che mostra il Frammento B. Il mio problema è quando sono in modalità Ritratto e mostra Frammento B, se l'utente seleziona un'opzione di menu Voglio aggiornare o ridisegnare la Vista associata a Frammento B e non riesco a capire come farlo funzionare. Ho provato il metodo getView e il metodo getLayoutInflater ma lo schermo non cambia perché penso di creare una nuova vista. Ho anche cercato di ottenere un riferimento a Fragment A pensando che potrei chiamare la sua routine per costruire un nuovo frammento e sostituire Fragment B ma non posso ottenere un riferimento perché non viene visualizzato. Quello che devo davvero fare è forzare il richiamo del metodo onCreateView per gonfiare la nuova vista, ma ho provato diversi metodi per provare a farlo ma non riesco a richiamare onCreateView. Qualche idea su come farlo?Forza Android Frammento da ricostruire Visualizza
risposta
se l'utente seleziona l'opzione di menu che voglio aggiornare o ridisegnare la vista che è associato con frammento B e non riesco a capire come fare questo lavoro
In onOptionsItemSelected()
, hanno la chiamata di attività un metodo sul frammento che lo fa aggiornare i suoi widget con il nuovo contenuto. In alternativa, eseguire l'attività a FragmentTransaction
per sostituire il frammento (se il frammento è stato originariamente impostato tramite FragmentTransaction
).
Si vuole eseguire un FragmentTransaction
e utilizzare il metodo di replace()
Questo non dovrebbe essere troppo difficile da fare, ma la risposta dipenderà da dove si trova il menu (cioè è la tua onOptionsItemSelected()
chiamata indietro all'interno della vostra attività genitore o si trova in frammento A/B?).
Supponiamo per semplicità, l'implementazione del menu e onOptionsItemSelected()
si trova nell'attività padre e si desidera rimodellare i frammenti nel caso in cui sia selezionata l'opzione menu_opzione1. Sarebbe simile a questa:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
//...
switch (item.getItemId()) {
case R.id.menu_option1:
//do something
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new YourFragmentClass();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.your_fragment_id, newFragment);
transaction.addToBackStack(null);
transaction.commit();
return true;
case R.id.menu_option2:
//do something else;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
In alternativa, se il menù è un bambino di uno dei tuoi frammenti (che dovrebbe essere per il bene di codice più riutilizzabile), allora un metodo è quello di richiedere che l'attività di accoglienza per implementare un'interfaccia definita da Fragment, che può essere utilizzata come richiamo. E nel callback onOptionsItemSelected()
all'interno della classe frammento, è sufficiente effettuare una chiamata a questo metodo di richiamata.
Anche se sembra un boccone, hai solo bisogno di fare un paio di cose. Fingere che questa è la classe Frammento
public static class FragmentA extends ListFragment {
OnSelectedListener mListener;
// Container Activity must implement this interface
public interface OnSelectedListener {
public void onSelected();
}
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//This is to ensure that the Activity has implemented the interface we set up above
try {
mListener = (OnSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnSelectedListener");
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
//...
switch (item.getItemId()) {
case R.id.menu_option1:
//do something
getActivity().onSelected();
return true;
case R.id.menu_option2:
//do something else;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
...
}
Poi nella attività, si dovrebbe vedere qualcosa di simile:
public class MainActivity extends Activity implements FragmentA.onSelectedListener{
...
public void onSelected(){
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new YourFragmentClass();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.your_fragment_id, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
Quando si sta sostituendo R.id.your_fragment_id, si stanno assumendo che è stato dichiarato in XML . Ma cosa succede se il mio frammento originale è stato costruito a livello di programmazione? –
@IgorGanapolsky questo sarà l'id per il contenitore di quel frammento – dmSherazi