2013-11-15 14 views
14

używam przykład dać w link poniżejFragment już aktywny - Gdy próbuje setArguments

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

Tutaj mam dwóch klas jedno biegnące liście fragmentów i drugą biegnącą fragmentem. teraz jestem przekazaniem obiektu do detailfragment w ten sposób:

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

Teraz w klasie Fragment otrzymam go, podstawowym celem jest, aby zaktualizować UI fragmentu na podstawie wybranego fragmentu na liście pozycji, to jest to powód jestem wysłanie przedmiotu

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

teraz na pozycji wybrany mówi „Fragment już aktywna” .

Na czym polega problem? Co ja robię źle?

Odpowiedz

11

z oficjalnej Android Przykładowe projekty:

public void setArguments (Bundle args) dostarczać argumentów budowlanych dla tego fragmentu. Można to tylko nazwać, zanim fragment zostanie przyłączony do jego działalności; to znaczy, powinieneś go nazwać natychmiast po skonstruowaniu fragmentu. Przedstawione tu argumenty zostaną zachowane w całym procesie niszczenia i tworzenia fragmentów.

Twój fragment jest już przywiązany do swojej działalności proponuję użyć własną metodę, nie trzeba setArguments!

tworzyć własne setUIArguments (zepnij args) wewnątrz klasy fragmentu i zaktualizować UI fragment wewnątrz tej metody

będzie wywołać tę metodę w ten sposób:

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

w swojej klasie fragment

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

Moja klasa w tej klasie DetailFragment rozszerza FragmentActivity i wewnątrz, że mam wewnętrzną klasę, która rozszerza fragment, teraz jak mogę nazwać tę metodę? – Goofy

+0

i potrzebuję kontekstu lub tego w klasie DetailFragment, czy możesz mi pomóc z tym – Goofy

18

Innym rozwiązaniem jest utworzenie pustego konstruktora dla fragmentu.

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

iw sposobie onListItemClick użyć tego zestawie:

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

Teraz można wywołać getArguments() methond w setUpLayout metoda().

+0

To jest naprawdę dobry pomysł i użyłem mutacji tego rozwiązania. Co więcej, należy ustawić to jako poprawną odpowiedź, ponieważ rozwiązanie koncentruje się wokół getArguments() i jego manipulacji - w przeciwieństwie do pierwszej odpowiedzi, która jest rozwiązaniem, które nie pasuje do * wszystkich * scenariuszy. – HBN

+1

Nie widzę '' 'Fragment''' mającego metodę o nazwie' 'setupLayout()' '' –

0

To jedna zmienna globalna:

private FragmentManager fragmentmanager; 
private FragmentTransaction fragmenttransaction; 

Są kod umieścić w swoim "liście Fragment" onCreate() działalność:

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

Są to Drawerlistitem kliknij wydarzenie:

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

Teraz rozszerzenie kodu fragmentu:

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

metoda publicznego dialogu fragment za

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

Pokaż lub zaktualizować fragment dialogu

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

Można sprawdzić, czy istnieją już argumenty, a jeśli tak, wystarczy dodać/zaktualizować je.

Opcjonalnie możesz usunąć istniejące argumenty, jeśli nie możesz bezpiecznie założyć, że istniejące wcześniej argumenty są nadal aktualne.

Powiązane problemy