2012-04-30 27 views
29

Tôi chỉ cố gắng để có một cái nhìn vào Fragment và tôi đã nhận một số probs với thứ ngu ngốc ... Có SkippersActivity.java tôi:Không thể được đúc để android.app.Fragment

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

Và skippers_fragment.xml tôi:

<?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> 

Và có SkippersFragment.xml tôi:

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 của tôi:

<?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> 

Tại sao tôi nhận:

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

Bạn có thể dán câu lệnh nhập của SkippersFragment.java không? – Rajesh

+0

nhập android.os.Bundle; nhập android.support.v4.app.Fragment; nhập android.view.LayoutInflater; nhập android.view.View; nhập android.view.ViewGroup; – Arkezis

+0

Vui lòng xem http://stackoverflow.com/a/5404643/1321873 và http://stackoverflow.com/a/5584218/1321873. – Rajesh

Trả lời

100

Nếu tôi phải đoán, SkippersFragment được mở rộng android.support.v4.app.Fragment. Tuy nhiên, SkippersActivitykhông phải mở rộng android.support.v4.app.FragmentActivity. Vì vậy, SkippersActivity đang cố sử dụng các đoạn API cấp 11 gốc.

+0

Bạn đang 100% bên phải ... NHƯNG, Họ nên có các mảnh đơn giản buộc phải được sử dụng trong một lọ mở rộng ... đây là một yêu cầu thực sự ngu ngốc, điều này ném tương thích ngược xuống cống ... – TacB0sS

+1

@ TacB0sS: Các lập trình viên có tài năng * tăng khả năng tương thích ngược bằng cách sử dụng gói Hỗ trợ Android. – CommonsWare

+0

Yeh, tôi biết đó là những gì tôi làm ... vấn đề bắt đầu khi những người khác phát triển cơ sở hạ tầng của bên thứ 3 không sử dụng gói v4 và phát triển cho các phiên bản hệ điều hành mới hơn trở lên đơn giản bởi vì nó có Fragments tích hợp vào hệ điều hành. Sau đó, bạn không thể sử dụng tính năng đó cho các phiên bản cũ hơn, và nếu lấy ví dụ, Dịch vụ Bản đồ v2 ... nó có hai loại phân đoạn một cho việc sử dụng Phân đoạn Hệ điều hành và một cho sử dụng v4 ... rực rỡ! – TacB0sS

19

Nếu bạn sử dụng gói tương thích v4, Hoạt động của bạn phải mở rộng FragmentActivity, chứ không phải Hoạt động. Nếu bạn sử dụng Android> 3.0, thì Hoạt động của bạn sẽ mở rộng Hoạt động, nhưng đọc câu trả lời của CommonsWare về việc không pha trộn cả hai loại phân đoạn.

0

Tôi đã gặp lỗi tương tự khi cố gắng mở rộng ListFragment. Phát hiện của tôi là, để sử dụng ListFragment trên một dự án với minSdkVersion < 11, tôi sẽ phải import android.support.v4.app.ListFragment;. Nếu không, tôi sẽ phải import android.app.ListFragment;.

link làm rõ câu hỏi của tôi.

2

Một điểm yếu khác cần lưu ý là đảm bảo bạn không quên gọi super.onCreate() từ hoạt động của bạn. Nếu bạn mắc phải sai lầm ngu ngốc như tôi đã làm, bạn cũng sẽ thấy lỗi "Lỗi khi tăng phân đoạn lớp" và "... không thể truyền tới android.app.Fragment", ngay cả khi bạn không khớp với tiêu chuẩn và hỗ trợ .v4 phiên bản của các lớp học.

+0

Không chỉ vậy, nhưng bạn phải gọi nó * trước khi * gọi 'setContentView' nếu đoạn của bạn nằm trong bố cục xml, câu trả lời của bạn đã giúp tôi khám phá. –

Các vấn đề liên quan