2013-11-15 7 views
14

Ich bin mit dem Beispiel geben in dem unten stehenden LinkFragment bereits aktiv - Wenn zu setArguments versucht

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

Hier habe ich zwei Klassen eine Verlängerung Liste Fragment und anderen erstreckt Fragment. Jetzt i Objekt am Übergang auf diese Weise detailfragment:

* von 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 
} 

Jetzt im Fragmente Klasse i empfange es, grundlegendes Ziel ist es, die Benutzeroberfläche des Fragments zu aktualisieren bezogen auf das Element in der Liste ausgewählt Fragment, das ist der Grund, warum ich das Objekt sendet am

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

Jetzt zum Produkt ausgewählt sagt er „Fragment bereits aktiv“ .

Was ist das Problem hier? Was mache ich falsch?

Antwort

11

Von der offiziellen Android-Entwicklung Referenz:

public void setArguments (Bundle args) Versorgung der Konstruktion Argumente für dieses Fragment. Dies kann nur aufgerufen werden, bevor das Fragment an seine Aktivität angehängt wurde; das heißt, Sie sollten es sofort nach dem Konstruieren des Fragments aufrufen. Die hier angegebenen Argumente bleiben über das Fragment-Destroy und die Erstellung erhalten.

Ihr Fragment bereits seine Tätigkeit gebunden ist ich Ihnen vorschlagen, Ihre eigene Methode zu verwenden, müssen Sie nicht setArguments brauchen!

Ihr eigenes setUIArguments (Bundle args) innerhalb der Fragment-Klasse erstellen und das Fragment UI aktualisieren innerhalb dieser Methode

Sie diese Methode auf diese Weise nennen:

@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 */ 
} 

in Ihrem Fragment Klasse

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

Meine Klasse in wie dieser Klasse DetailFragment erweitert FragmentAktivität und innerhalb, dass ich innere Klasse haben, die Fragment erweitert, jetzt, wie kann ich diese Methode nennen? – Goofy

+0

und auch ich brauche Kontext oder dies in der DetailFragment-Klasse, können Sie mir bitte dabei helfen – Goofy

18

Eine andere Lösung besteht darin, einen leeren Konstruktor für Ihr Fragment zu erstellen.

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

und in der onListItemClick Methode verwenden Sie dieses 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 
} 

Jetzt können Sie die getArguments() aufrufen methond in Ihrem setUpLayout() -Methode.

+0

Dies ist eigentlich eine gute Idee, und ich habe eine Mutation für die Lösung verwendet. Darüber hinaus sollte dies als die richtige Antwort festgelegt werden, da sich die Lösung um getArguments() und seine Manipulation dreht - anders als die erste Antwort, die eine Problemumgehung ist, die * alle * Szenarien nicht passt. – HBN

+1

Ich sehe '' 'Fragment''' nicht mit einer Methode namens' '' setupLayout() '' ' –

0

Dieses globale Variable:

private FragmentManager fragmentmanager; 
private FragmentTransaction fragmenttransaction; 

Dieser Code setzte in Ihrer "Liste Fragment" onCreate() Aktivität:

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

Dies ist Drawerlistitem klicken Ereignis:

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

Jetzt wird der Fragmentcode wie folgt erweitert:

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

öffentliche Methode Dialogue Fragment

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

anzeigen oder aktualisieren Dialog Fragment

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

Sie können prüfen, ob es bereits Argumente sind, und wenn ja gerade sie hinzufügen/aktualisieren.

Optional können Sie vorhandene Argumente löschen, wenn Sie nicht sicher davon ausgehen können, dass bereits vorhandene Argumente noch gültig sind.

Verwandte Themen