2011-10-17 3 views
14

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

1

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).

9

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(); 
} 
} 
+7

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? –

+1

@IgorGanapolsky questo sarà l'id per il contenitore di quel frammento – dmSherazi