2013-11-15 14 views
14

sto usando l'esempio cedere sul link qui sottoFragment già attiva - Quando si tenta di setArguments

http://android-er.blogspot.in/2013/04/handle-onlistitemclick-of-listfragment.html

Qui ho due classi uno estendono Lista Frammento e altri che si estende Fragment. Ora sto passando oggetto da detailfragment in questo modo:

* da ListFragment *

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     Bundle bundle = new Bundle(); 
     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setArguments(bundle); 
     detailFragment.setUpLayout();// update the UI 
} 

Ora nella classe Frammento ricevo esso, obiettivo fondamentale è quello di aggiornare l'interfaccia utente del frammento in base alla voce selezionata nel frammento lista, questo è il motivo per cui io mando l'oggetto

Bundle b = getArguments(); 
b.getSerializable(BUNDLE_KEY); 

Ora sulla voce selezionata si dice "Fragment già attivo" .

Qual è il problema qui? Che cosa sto facendo di sbagliato?

risposta

11

Dalla Gazzetta di riferimento di sviluppo Android:

pubblici setArguments vuoto (args Bundle) alimentazione gli argomenti di costruzione per questo frammento. Questo può essere chiamato solo prima che il frammento sia stato associato alla sua attività; cioè, dovresti chiamarlo subito dopo aver costruito il frammento. Gli argomenti forniti qui verranno mantenuti attraverso la distruzione e la creazione dei frammenti.

tuo frammento è già collegato alla sua attività vi suggerisco di utilizzare il proprio metodo, non è necessario setArguments!

creare il proprio setUIArguments (args bundle) all'interno della classe frammento e aggiornare l'interfaccia utente frammento all'interno di questo metodo

Potrai chiamare questo metodo in questo modo:

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     Bundle bundle = new Bundle(); 
     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setUIArguments(bundle); /* your new method */ 
} 

nella classe frammento

public void setUIArguments(Bundle args) { 
    getActivity().runOnUiThread(new Runnable() { 
     public void run() { 
      /* do your UI stuffs */ 
     } 
    } 
} 
+0

La mia classe in questa classe DetailFragment estende FragmentActivity e al suo interno ho una classe interna che estende il frammento, ora come posso chiamare questo metodo? – Goofy

+0

e anche io ho bisogno di un contesto o di questo nella classe DetailFragment, puoi aiutarmi con quello – Goofy

18

Un'altra soluzione è creare un costruttore vuoto per il frammento.

public Detailfragment() { 
    super(); 
    // Just to be an empty Bundle. You can use this later with getArguments().set... 
    setArguments(new Bundle()); 
} 

e nel metodo onListItemClick si utilizza tale bundle:

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

    // Update the keys. 
    detailFragment.getArguments().putSerializable(BUNDLE_KEY, obj);// passing this object 

    detailFragment.setUpLayout();// update the UI 
} 

Ora è possibile chiamare il getArguments() methond nel metodo() setUpLayout.

+0

Questa è in realtà una buona idea e ho usato una mutazione per la soluzione. Inoltre, questa dovrebbe essere impostata come risposta corretta, poiché la soluzione ruota attorno a getArguments() e alla sua manipolazione, diversamente dalla prima risposta che è una soluzione che non si adatta agli scenari * tutti *. – HBN

+1

Non vedo '' '' Fragment''' con un metodo chiamato '' 'setupLayout()' '' –

0

Questa variabile globale:

private FragmentManager fragmentmanager; 
private FragmentTransaction fragmenttransaction; 

Questi codice mettere in "Lista Fragment" onCreate() Attività:

fragmenttransaction = fragmentmanager.beginTransaction(); 
fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); 
fragmenttransaction.addToBackStack(null); 
fragmenttransaction.commit(); 

Questi è Drawerlistitem evento Click:

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 

    Bundle bundle = new Bundle(); 
    fragmenttransaction = fragmentmanager.beginTransaction(); 

     if(fragmentmanager.findFragmentById("test") != null) { 
      fragmenttransaction.remove(fragmentmanager.findFragmentByTag("test")); 
     }  

    Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setArguments(bundle); 
     fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); 
     fragmenttransaction.addToBackStack(null); 
     fragmenttransaction.commit();  
} 

Ora estendi il codice Framment così com'è:

Bundle b = getArguments(); 
b.getSerializable(BUNDLE_KEY); 
0

metodo pubblico del frammento dialogo

public void setBundle(final Bundle bundle) { 
     final Bundle arguments = getArguments(); 
     arguments.clear(); 
     arguments.putAll(bundle); 
    } 

Mostra o aggiornare frammento di dialogo

public void showMessageDialogue(final String tag, final Bundle bundle) { 
     final Fragment fragment = mFragmentManager.findFragmentByTag(tag); 
     if (fragment != null && fragment instanceof MessageDialogueFragment) { 
      ((MessageDialogueFragment) fragment).setBundle(bundle); 
     } else { 
      final MessageDialogueFragment messageDialogueFragment = new MessageDialogueFragment(); 
      messageDialogueFragment.setArguments(bundle); 
      messageDialogueFragment.show(mFragmentManager, tag); 
     } 
    } 
9

È possibile verificare se ci sono già argomenti, e in tal caso basta aggiungere/li aggiorna.

private static void initFrag(Fragment frag, Bundle args) { 
    if (frag.getArguments() == null) { 
     frag.setArguments(args); 
    } else { 
     //Consider explicitly clearing arguments here 
     frag.getArguments().putAll(args); 
    } 
} 

Opzionalmente, si potrebbe desiderare di sgombrare il campo da argomenti esistenti se non si può tranquillamente supporre che gli argomenti pre-esistenti sono ancora validi.

Problemi correlati