2012-04-30 25 views
29

Sólo estoy tratando de tener una mirada en Fragmento y me dieron algunos hubieron problemas con la materia estúpida ... No es mi SkippersActivity.java:no se puede convertir a android.app.Fragment

public class SkippersActivity extends Activity{ 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.skippers_fragment); 
} 
} 

Y mi skippers_fragment.xml:

<?xml version="1.0" encoding="utf-8"?> 
    <fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:name="com.arkezis.globedroid.SkippersFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/skippers_fragment"> 
    </fragment> 

Y no es mi SkippersFragment.xml:

public class SkippersFragment extends Fragment{ 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View mainView = inflater.inflate(R.layout.skippers, container, false);  
    return mainView; 
} 

}

Mi skippers.xml:

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" >  
    <ListView android:id="@+id/list_skippers_all" 
     android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    </ListView> 
    </LinearLayout> 

¿Por qué tengo:

04-30 13:45:16.355: E/AndroidRuntime(30077): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arkezis.globedroid/com.arkezis.globedroid.SkippersActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.os.Looper.loop(Looper.java:137) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.ActivityThread.main(ActivityThread.java:4424) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at java.lang.reflect.Method.invokeNative(Native Method) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at java.lang.reflect.Method.invoke(Method.java:511) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at dalvik.system.NativeStart.main(Native Method) 
04-30 13:45:16.355: E/AndroidRuntime(30077): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.view.LayoutInflater.inflate(LayoutInflater.java:466) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.Activity.setContentView(Activity.java:1835) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at com.arkezis.globedroid.SkippersActivity.onCreate(SkippersActivity.java:19) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.Activity.performCreate(Activity.java:4465) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
04-30 13:45:16.355: E/AndroidRuntime(30077): ... 11 more 
04-30 13:45:16.355: E/AndroidRuntime(30077): Caused by: java.lang.ClassCastException: com.arkezis.globedroid.SkippersFragment cannot be cast to android.app.Fragment 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.Fragment.instantiate(Fragment.java:574) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.Fragment.instantiate(Fragment.java:549) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.app.Activity.onCreateView(Activity.java:4235) 
04-30 13:45:16.355: E/AndroidRuntime(30077): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673) 
+0

¿Puedes pegar las instrucciones de importación de SkippersFragment.java? – Rajesh

+0

import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; – Arkezis

+0

Por favor, eche un vistazo a http://stackoverflow.com/a/5404643/1321873 y http://stackoverflow.com/a/5584218/1321873. – Rajesh

Respuesta

100

Si tuviera que adivinar, SkippersFragment está extendiendo android.support.v4.app.Fragment. Sin embargo, SkippersActivity es no que extiende android.support.v4.app.FragmentActivity. Por lo tanto, SkippersActivity está intentando usar fragmentos nativos de API de nivel 11.

+0

Estás 100% en lo cierto ... PERO, simplemente debieron haber forzado fragmentos para ser utilizados en un frasco de extensión ... este es un requisito realmente estúpido, esto arroja compatibilidad hacia atrás por el desagüe ... – TacB0sS

+1

@ TacB0sS: Los programadores talentosos * aumentan * la compatibilidad hacia atrás mediante el uso del paquete de soporte de Android. – CommonsWare

+0

Sí, sé que es lo que hago ... el problema comienza cuando otros que desarrollan una infraestructura de terceros no usan el paquete v4, y desarrollan versiones de sistemas operativos más nuevos y superiores simplemente porque tiene Fragmentos incorporados en el sistema operativo. Entonces no puedes usar esa característica para versiones anteriores, y si tomas, por ejemplo, el servicio Map v2 ... tiene dos tipos de fragmentos, uno para el uso del Fragmento OS y otro para el uso de v4 ... ¡genial! – TacB0sS

19

Si utiliza el paquete de compatibilidad v4, su actividad debe ampliar FragmentActivity, no Activity. Si usa Android> 3.0, su Actividad extiende la Actividad, pero lea la respuesta de CommonsWare sobre no mezclar ambos tipos de fragmentos.

0

Me encontré con el mismo error al intentar ampliar ListFragment. Mi conclusión es que, para usar ListFragment en un proyecto con minSdkVersion < 11, tendré que escribir import android.support.v4.app.ListFragment;. De lo contrario, tendré que llamar al import android.app.ListFragment;.

Esto link aclaró mi pregunta.

2

Otro peligro a tener en cuenta es asegurarse de que no olvide llamar a super.onCreate() de su actividad. Si cometes este error tonto como yo, también verás los errores "Error al inflar el fragmento de clase" y "... no se pueden convertir a android.app.Fragment", incluso si no has coincidido con el estándar y el soporte .v4 versiones de las clases.

+0

No solo eso, sino que tienes que llamarlo * antes * de llamar a 'setContentView' si tu fragmento está en el diseño xml, que tu respuesta me ayudó a descubrir. –

Cuestiones relacionadas