2011-11-06 12 views
10

Sto provando a far funzionare il codice here. Compila bene. Funzionerà. E caricherà la scheda 1 (di 3). Tuttavia, quando si fa clic sulla scheda 2 ° o 3 °, ottengo questo:FragmentTransaction .attach e .detach per le schede della barra delle azioni

java.lang.NoSuchMethodError: android.app.FragmentTransaction.detach

questo accade nel codice qui

public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    if (mFragment != null) { 
     //ft.detach(mFragment); //requires API Level 13 
     ft.remove(mFragment); //this does not do the same thing as detach 
    } 
} 

ho scoperto che detach è disponibile solo per API Livello 13. Ho provato remove, ma non fa la stessa cosa, ovviamente. Qualcuno ha qualche idea su come superare questo basato sul codice nel primo link?


EDIT: immagino lo stesso vale per attach come che è anche nel codice, ma non viene colpito prima l'applicazione si blocca.

risposta

13

Sembra che la sostituzione dei diversi punti nel codice che fa riferimento a collegare e scollegare con aggiungi e rimuovi consentirà al codice di funzionare normalmente in un ambiente di livello 13 pre-API.

public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); 
     if (mFragment != null) { // && !mFragment.isDetached()) { 
      FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); 
      //ft.detach(mFragment); 
      ft.remove(mFragment); 
      ft.commit(); 
     } 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     //if (mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
     //} else { 
     // ft.attach(mFragment); 
     //} 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      //ft.detach(mFragment); //requires API 13 
      ft.remove(mFragment); //this does not do the same thing as detach 
     } 
    } 
+4

ma con ft.add/rimuovere frammento dello stato si perde quando si passa da una scheda all'altra – Arvis

2

se si utilizza il FragmentTransaction in API 4+ compatablity pacchetto -android.support.v4.app.FragmentTransaction - si dovrebbe essere in grado di chiamare attaccare e staccare i metodi a livello di API pre 13 piattaforme.

http://developer.android.com/resources/samples/Support4Demos/index.html

+0

post del blog correlati: [ Frammenti per tutti] (http://android-developers.blogspot.com/2011/03/fragments-for-all.html) – blahdiblah

Problemi correlati