2011-09-07 2 views
5

Utilizzo il pacchetto di compatibilità Android ma ho riscontrato il seguente problema, sembra che ogni volta che creo un frammento come classe statica interna sulla mia applicazione e provi ad avviare tale attività, visualizza il seguente errorePacchetto di compatibilità Android Frammento come classe statica interna

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment org.wr.CreditCardHolderActivity.CreditCardHolderFragment: make sure class name exists, is public, and has an empty constructor that is public 

E quando separo il frammento e l'attività tutto funziona correttamente, qualcuno sa perché? e come posso risolverlo?

Grazie!

+0

come viene caricato il frammento nel contenitore? Via layout XML o in codice? Non ho provato il primo ma non ho avuto problemi con le classi di frammenti interni statici con quest'ultimo. BTW sto usando la v1 della compat lib. – PJL

+0

ho un layout con il frammento con contiene ovviamente il tag insieme al nome della classe interna. – Necronet

+1

hai esaminato l'esempio FragmentLayoutSupport nelle demo API? Riferisce una classe framment interna statica tramite: ** PJL

risposta

7

Se si dispone di un frammento classe interna come:

public class SomethingFragment extends Fragment {  
    public static final class TypeFragment extends BaseFragment 
    { 

    public static Fragment newInstance() 
    { 
     return new TypeFragment(); 
    } 

    private View mRootView; 
    private ListView mListView; 

    /** 
    * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, 
    *  android.view.ViewGroup, android.os.Bundle) 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     mRootView = inflater.inflate(R.layout.fragment_category_list, container, false); 
     mListView = (ListView) mRootView.findViewById(R.id.fragment_listview); 
     return mRootView; 
    } 
    } 
} 

Assicurarsi che la qualificazione è pubblico quando il FragmentActivity cerca di iniziare nuovamente il frammento non chiama dalla classe concreta sarà gestirlo dal FragmentActivity astratto, e se la classe frammento interiore è privata la cui attività non ha alcun riferimento alla onSaveState, onRestoreState, inizializzare ecc ..

private-public fissata per me!

Aggiornamento:

Dai un'occhiata alla https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/app/Fragment.java

Il metodo instantiate chiama newInstance() quando si cerca di ripristinare il Fragment da uno stato salvato (in cui il frammento è stato completamente distrutto).

Il metodo newInstance richiede che la classe sia accessibile al pubblico, quindi, quando definita come classe interna, significa che deve essere public e static se necessario.

Spero che questo chiarisca alcune domande future.

+1

Non è mai in ritardo ad accettare la risposta grazie ho dimenticato di farlo ... – Necronet

+0

Non capisco: perché è è importante che i frammenti siano pubblici? causerà qualche eccezione? se sì, in quali casi? se l'unica classe che utilizza il frammento è l'attività, perché non impostarla come classe statica privata? se utilizzo il frammento solo per viewPager, è ok impostarlo come privato? –

+1

@androiddeveloper Beh, in realtà è il 'FragmentManager' che mantiene il ciclo di vita del' Fragment', non l'attività. Avrei bisogno di controllare il codice sorgente, ma tutti i frammenti sono controllati per i costruttori pubblici vuoti, in quanto è ciò che il gestore dei frammenti creerà un'istanza quando è necessario creare il frammento, Quindi se i frammenti sono in un ambito diverso da 'FragmentManager' questo ovviamente non è possibile. (A supposizione penso che chiamerebbe https://developer.android.com/reference/java/lang/Class.html#newInstance()) –