2013-01-09 14 views
39

To pytanie dotyczy głównie opinii na temat najlepszego sposobu obsługi mojej aplikacji. Za pomocą jednego działania mam do czynienia z trzema fragmentami. Fragment A ma jeden klikalny element na zdjęciu, a Fragment B zawiera 4 klikalne elementy. Drugi fragment wyświetla szczegóły po kliknięciu zdjęcia. Używam ActionBarSherlock.Komunikacja między fragmentem a działaniem - najlepsze praktyki

Screen shot

do przodu i do tyłu przyciski trzeba zmienić zdjęcie do następnej lub poprzedniej pozy, odpowiednio. Mogłem zachować zdjęcie i przyciski w tym samym fragmencie, ale chciałem je rozdzielić na wypadek, gdybym chciał je zmienić w tablecie.

Potrzebuję porady - czy powinienem połączyć fragmenty A i B? Jeśli nie, będę musiał dowiedzieć się, jak zaimplementować interfejs dla 3 klikalnych elementów.

Zastanawiam się nad używaniem Roboguice, ale już rozszerzam korzystanie z SherlockFragmentActivity, więc nie ma wyjścia. Widziałem wzmiankę o Otto, ale nie widziałem dobrych tutoriali na temat tego, jak włączyć projekt. Jak myślisz, jaka powinna być najlepsza praktyka projektowa?

Potrzebuję też pomocy w określeniu sposobu komunikacji między fragmentem a działaniem. Chciałbym zachować pewne dane "globalne" w aplikacji, takie jak id poz. Czy jest jakiś przykładowy kod, który mogę zobaczyć oprócz informacji o programach na Androidzie? To nie jest takie pomocne.

BTW, już przechowuję wszystkie informacje o każdej pozie w bazie danych SQLite. To łatwa część.

+0

W rzeczywistości można używać Rogoguice z ActionbarSherlock, zajrzyj na https://github.com/rtyley/roboguice-sherlock. – rubenlop

+0

Otto jest jeszcze prostsze, jest pakowany jako samodzielny plik .jar, który można umieścić w katalogu libs/swojej aplikacji. – rubenlop

+1

@ rubenlop88 dodanie biblioteki tylko po to, aby przekazać niektóre dane z Fragmentu do Aktywności? –

Odpowiedz

54

Najprostszym sposobem na komunikację między działaniem a fragmentami jest używanie interfejsów. Chodzi o to, aby zdefiniować interfejs wewnątrz danego fragmentu A i pozwolić, aby działanie zaimplementowało ten interfejs.

Po zaimplementowaniu tego interfejsu możesz zrobić wszystko, co chcesz, w metodzie, którą zastępuje.

Inną ważną częścią interfejsu jest to, że musisz wywołać abstrakcyjną metodę ze swojego fragmentu i pamiętać, aby rzucić ją do swojej aktywności. Powinien wychwycić wyjątek ClassCastException, jeśli nie zostanie wykonany poprawnie.

Istnieje dobry tutorial na temat Simple Developer Blog, w jaki sposób robić dokładnie takie rzeczy.

Mam nadzieję, że było to pomocne!

+2

Właśnie to zrobiłem. Dzięki. –

+1

Czy ktoś wie, dlaczego przykład na stronie programistów Androida dotyczący korzystania z okna dialogowego alertu nie korzysta z interfejsu do komunikowania się z działaniem? http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog – cjayem13

+1

Lub użyj EventBus https://github.com/greenrobot/EventBus – powder366

1

Nie jestem pewien, czy naprawdę zrozumiałem, co chcesz zrobić, ale sugerowany sposób komunikacji między fragmentami polega na użyciu wywołań zwrotnych w działaniu, nigdy bezpośrednio między fragmentami. Zobacz tutaj: http://developer.android.com/training/basics/fragments/communicating.html

+0

Tak, to wydaje się być mylące, mam 2 fragmenty, które muszą w jakiś sposób komunikować się ze sobą poprzez działanie. Czy jest lepszy tutorial na temat tego, jak to zrobić? –

+1

@KristyWelsh: Zastanawiam się, czy opracowałeś własną koncepcję tego, czym są "Fragmenty" i jak działają, zamiast uchwycić rzeczywistą koncepcję celu projektu "Fragment". Koncepcja komunikacji z 'Activity' przy użyciu' interfejsów' nie różni się od posiadania 'Activity' implementacji' View.OnClickListener', więc naciśnięcie 'Button' powoduje dodanie elementu do' ListView' (na przykład).Możesz mieć 'Activity' z FragmentA i FragmentB ale NOT FragmentC - w tym przypadku koncepcja posiadania FragmentA" wiedzieć "jak rozmawiać z FragmentC bezpośrednio jest zbędna. – Squonk

20

Sugerowana metoda komunikacji między fragmentami polega na użyciu wywołań zwrotnych \ słuchaczy zarządzanych przez główną aktywność.

Myślę, że kod na tej stronie jest całkiem jasne: http://developer.android.com/training/basics/fragments/communicating.html

Można również odwołać Harmonogram app IO 2012, który został zaprojektowany, aby być aplikacja odniesienia de facto. Można go znaleźć tutaj: http://code.google.com/p/iosched/

Również tutaj jest SO pytanie z dobrych informacji: How to pass data between fragments

0

Można tworzyć zadeklarować publiczny interfejs z deklaracją funkcji we fragmencie i implementować interfejs w działalności . Następnie możesz wywołać funkcję z fragmentu.

0

Używam Intents do przekazywania działań z powrotem do głównego działania. Główną czynnością jest ich słuchanie poprzez nadpisanie New intent (intent intent). Główna aktywność tłumaczy na przykład te działania na odpowiadające im fragmenty.

Więc można zrobić coś takiego:

public class MainActivity extends Activity { 

    public static final String INTENT_ACTION_SHOW_FOO = "show_foo"; 
    public static final String INTENT_ACTION_SHOW_BAR = "show_bar"; 


    @Override 
    protected void onNewIntent(Intent intent) { 
     routeIntent(intent); 
    } 

    private void routeIntent(Intent intent) { 
     String action = intent.getAction(); 
     if (action != null) {    
      switch (action) { 
      case INTENT_ACTION_SHOW_FOO: 
       // for example show the corresponding fragment 
       loadFragment(FooFragment); 
       break; 
      case INTENT_ACTION_SHOW_BAR: 
       loadFragment(BarFragment); 
       break;    
     } 
    } 
} 

Następnie wewnątrz dowolnego fragmentu pokazać fragment foo:

Intent intent = new Intent(context, MainActivity.class); 
intent.setAction(INTENT_ACTION_SHOW_FOO); 
// Prevent activity to be re-instantiated if it is already running. 
// Instead, the onNewEvent() is triggered 
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
getContext().startActivity(intent); 
2

Istnieje severals sposoby komunikacji pomiędzy działania, fragmenty, usług itd. Oczywistym jest komunikowanie się za pomocą interfejsów. Jednak nie jest to skuteczny sposób komunikacji. Musisz zaimplementować słuchaczy itp.

Moja sugestia to skorzystanie z autobusu zdarzeń. Magistrala zdarzeń jest implementacją wzorca publikowania/subskrybowania.

Możesz zapisać się do wydarzeń w swojej działalności, a następnie można zakładać, że wydarzenia w swoim fragmentów itp

Tutaj on my blog post można znaleźć więcej szczegółów na temat tego wzorca, a także an example project pokazać użycie.

5

Jest on realizowany przez oddzwonić interfejsu: Przede wszystkim musimy zrobić interfejs:

public interface UpdateFrag { 
    public void updatefrag(); 
    } 

W działalności zrobić poniższy kod:

UpdateFrag updatfrag ; 
public void updateApi(UpdateFrag listener) { 
     updatfrag = listener; 
    } 

z imprezy skąd zwrotna musi wystrzelić aktywność:

updatfrag.updatefrag(); 

W Fragment implementacji i nterface w CreateView wykonaj poniższy kod:

((Home)getActivity()).updateApi(new UpdateFrag() { 
       @Override 
       public void updatefrag() { 
        .....your stuff...... 
       } 
      }); 
1

Zrobiłem bibliotekę adnotacji, która może obsadzić cię za ciebie. Sprawdź to. https://github.com/zeroarst/callbackfragment/

@CallbackFragment 
public class MyFragment extends Fragment { 

    @Callback 
    interface FragmentCallback { 
     void onClickButton(MyFragment fragment); 
    }  
    private FragmentCallback mCallback; 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.bt1 
       mCallback.onClickButton(this); 
       break; 
      case R.id.bt2 
       // Because we give mandatory = false so this might be null if not implemented by the host. 
       if (mCallbackNotForce != null) 
       mCallbackNotForce.onClickButton(this); 
       break; 
     } 
    } 
} 

Następnie generuje podklasy swojego fragmentu. I po prostu dodaj go do FragmentManager.

public class MainActivity extends AppCompatActivity implements MyFragment.FragmentCallback { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     getSupportFragmentManager().beginTransaction() 
      .add(R.id.lo_fragm_container, MyFragmentCallbackable.create(), "MY_FRAGM") 
      .commit(); 
    } 

    Toast mToast; 

    @Override 
    public void onClickButton(MyFragment fragment) { 
     if (mToast != null) 
      mToast.cancel(); 
     mToast = Toast.makeText(this, "Callback from " + fragment.getTag(), Toast.LENGTH_SHORT); 
     mToast.show(); 
    } 
} 
Powiązane problemy