2012-01-29 12 views
6

Sto cercando di aggiungere un support.v4.app.Fragment a una PreferenceActivity intestazione, in questo modo:Android: soluzione alternativa per support.v4.app.Fragment -> Framment classcastexception?

<header 
    android:fragment="com.example.SupportFragmentSubClass" 
    android:title="Selecting this should show the accompanying fragment" > 
</header> 

Questo getta una ClassCastException, presumibilmente perché il PreferenceActivity si aspetta una sotto-classe di android.app.Fragment, piuttosto che support.v4.app.Fragment.

mio caso d'uso è questo:
ho Frammento non standard che voglio usare come una preferenza su entrambi i dispositivi < 3.0 e> 3.0. Per> = 3.0, ho bisogno di una sottoclasse android.app.Fragment in modo che possa essere incorporata nel "riquadro dettagli" dell'attività delle preferenze sui dispositivi tablet. Per < 3.0, ho bisogno di una sottoclasse v4.support.app.Fragment in modo da poter inserire un ActivityFragment.

Esiste una soluzione che mi consenta di utilizzare un frammento di compatibilità in questa situazione?

risposta

7

PreferenceFragment non è nel pacchetto di supporto Android e non è possibile utilizzare un pacchetto di supporto Android frammento di classe in un PreferenceActivity in questo modo. Inoltre, le intestazioni non funzionerebbero su Android 2.x in ogni caso, dal momento che lo PreferenceActivity in Android 2.x non conosce i frammenti.

In linea di principio, è possibile inserire lo PreferenceActivity dal codice sorgente per crearne uno che utilizzi la versione di supporto Android di Fragment.

Oppure, organizza le tue preferenze per utilizzare frammenti su Android 3.0+ ed evitali su Android 2.x. Here is a sample project dove mostro un modo per farlo.

+0

Scusa, non penso che la soluzione di @CommonsWare sia perfetta. In realtà, abbiamo bisogno di una compatibilità PreferenceFragment. Poiché PreferenceFragment può essere inserito in qualsiasi layout di qualsiasi attività, anche l'attività si estende da ActionBarActivity. PreferenceActivity non si estende da ActionBarActivity, non ha un layout ActionBar coerente in tutte le versioni di Android. – Lei

2

Come sottolinea @CommonsWare, non è possibile ciò che volevo senza riscrivere PreferenceActivity e sembra un carico di lavoro.

La soluzione poco elegante che ho optato per creare due PreferenceActivities (as shown here) e creare anche due sottoclassi di Fragment, una per ogni gusto di Fragment.

Quindi, PrefsActivityHC aggiunge questa intestazione:

<header 
    <!-- An android.app.Fragment subclass --> 
    android:fragment="com.example.project.MyFragmentHC" 
</header> 

... mentre PrefsActivity aggiunge questa preferenza:

<Preference> 
    <intent 
     <!-- A v4.support.app.Fragment subclass, wrapped in an ActivityFragment --> 
     android:targetClass="com.example.project.MyFragmentActivity" 
     android:targetPackage="com.example.project" > 
    </intent> 
</Preference> 

Per ridurre al minimo la quantità di duplicazione del codice tenuti ad avere due frammenti quasi identiche, Ho creato una classe MyFragmentDelegate che supporta i metodi di frammentazione comuni e ne ho contenuta un'istanza in MyFragment e MyFragmentHC. Le chiamate ai metodi in questi frammenti vengono quindi semplicemente inoltrate al delegato:

class MyFragment { 

    MyFragmentDelegate mDelegate; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    } 
} 

class MyFragmentHC { 

    MyFragmentDelegate mDelegate; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    } 
} 
Problemi correlati