2012-04-30 5 views
29

Я просто пытаюсь взглянуть на фрагменте, и я получил некоторую Probs с глупой вещью ... Существует мой SkippersActivity.java:не может быть приведен к android.app.Fragment

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

И мой 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> 

И мой 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; 
} 

}

Мой 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> 

Почему я получил:

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

Можете ли вы вставить заявления импорта SkippersFragment.java? – Rajesh

+0

импорт android.os.Bundle; import android.support.v4.app.Fragment; импорт android.view.LayoutInflater; импорт android.view.View; import android.view.ViewGroup; – Arkezis

+0

См. Http://stackoverflow.com/a/5404643/1321873 и http://stackoverflow.com/a/5584218/1321873. – Rajesh

ответ

100

Если бы я должен был догадаться, SkippersFragment расширяет android.support.v4.app.Fragment. Однако SkippersActivity является не расширение android.support.v4.app.FragmentActivity. Итак, SkippersActivity пытается использовать собственные фрагменты API уровня 11.

+0

Вы на 100% правы ... НО, У них должны быть просто вынутые фрагменты, которые будут использоваться в расширительном банке ... это действительно глупое требование, это отбрасывает обратную совместимость вниз по стоку ... – TacB0sS

+1

@ TacB0sS: Талантливые программисты * увеличивают * обратную совместимость с помощью пакета поддержки Android. – CommonsWare

+0

Yeh, я знаю, что это то, что я делаю ... Проблема начинается, когда другие, которые разрабатывают стороннюю инфраструктуру, не используют пакет v4 и не разрабатывают для более новых версий ОС и выше просто потому, что в Fragments встроена ОС. Тогда вы не можете использовать эту функцию для более старых версий, и если взять, например, службу Map v2 ... у нее есть два типа фрагментов, один для использования в OS Fragment и один для использования v4 ... блестящий! – TacB0sS

19

Если вы используете пакет совместимости v4, ваша активность должна расширять FragmentActivity, а не Activity. Если вы используете Android> 3.0, то ваша активность расширяет активность, но читайте ответ CommonsWare о том, чтобы не смешивать оба типа фрагментов.

0

Я столкнулся с той же ошибкой, пытаясь расширить ListFragment. Я нахожу, что для использования ListFragment в проекте с minSdkVersion < 11, мне нужно будет import android.support.v4.app.ListFragment;. В противном случае мне придется import android.app.ListFragment;.

Этот link уточнил мой вопрос.

2

Еще одна ошибка, на которую следует обратить внимание - это убедиться, что вы не забыли вызвать super.onCreate() из своей деятельности. Если вы сделаете эту тупую ошибку, как я, вы также увидите, что «Ошибка раздувания фрагмента класса» и «... нельзя отбрасывать на ошибки android.app.Fragment», даже если вы не ошиблись стандарт и поддержку .v4 классов.

+0

Не только это, но вы должны называть его * перед * вызовом 'setContentView' если ваш фрагмент находится в макете xml, который ваш ответ помог мне открыть. –

Смежные вопросы