8

Chỉnh sửa: Để biết chi tiết cách thực hiện, hãy xem my answer.ActionBarSherlock + Bản đồ + Trình tải = java.lang.NoClassDefFoundError

Tôi đang đấu tranh với nó trong hai ngày nay, hy vọng ai đó có thể giúp đỡ.

Tôi đang cố gắng sử dụng ActionBarSherlock mới nhất (4.0) với MapView. Tôi biết nó có vấn đề với những mảnh vỡ, nhưng tôi không cần chúng trong hoạt động này. Nhưng tôi cần Loaders và nó xuất hiện, để sử dụng Loaders tôi cũng phải mở rộng FragmentActivity. Không sao, tôi nghĩ, chúng tôi có số android-support-v4-googlemaps từ Pete Doyle. Như đã đề xuất trên nhiều chủ đề SO và Google Groups, tôi xây dựng ABS với Android-support-v4-googlemaps JAR (thực sự là android-support-v13-r7-googlemaps.jar) thay vì android-support-v4.jar. Sau đó, tôi sử dụng nó như một thư viện cho dự án của tôi.

Bây giờ, tôi muốn có hoạt động của tôi theo cách này:

public class BananoutMapActivity extends SherlockFragmentActivity implements LoaderCallbacks<ArrayList<EventItem>>{

Vấn đề:

Nó biên dịch, nhưng ném một lỗi runtime: E/AndroidRuntime(29159): java.lang.NoClassDefFoundError: ndl.klimczak.bananout.BananoutMapActivity

Điều tôi đã kiểm tra ba lần:

  • cả dự án thư viện ActionBarSherlock và dự án của tôi được nhắm mục tiêu tại Google API 4.0.3
  • Tôi có <uses-library android:name="com.google.android.maps" /> và tôi có nó trong thẻ ứng dụng.
  • Tôi cũng có cùng android-support-v13-r7-googlemaps.jar trong việc xây dựng con đường của dự án của tôi
  • Tôi đã .BananoutMapActivity khai báo trong tôi manifest

là gì thú vị:

  • Khi tôi chạy nó trên một giả lập ICS nó hoạt động (các lỗi xuất hiện trên 2. * emulators và 2.3.7 điện thoại của tôi), trên Honeycomb nó sẽ làm việc quá lẽ, đó là câu hỏi của việc sử dụng ACL tôi đoán

  • Khi tôi loại bỏ các phần implements LoaderCallbacks<ArrayList<EventItem>> nó hoạt động quá, nhưng cách này tôi không thể sử dụng LoaderManager

Tại sao trên trái đất lỗi NoClassDefFoundError và làm thế nào để có được những xúc lật làm việc tại MapCapableSherlockEnabledFragmentActivity của tôi ?

Trả lời

6

Bạn cần sử dụng bộ tải từ thư viện hỗ trợ thay vì bộ tải từ nền tảng. Vì những tính năng này chỉ khả dụng trên Android 3.0+ và thực tế là bạn đã bao gồm chúng trong định nghĩa lớp học của bạn sẽ khiến trình nạp lớp trước 3.0 từ chối lớp học của bạn hoàn toàn. Việc chuyển nhập của bạn sang các biến thể của thư viện hỗ trợ phải là tất cả những gì cần thiết cho điều đó.

Nếu bạn nhìn trên ngoại lệ trong Logcat, bạn sẽ thấy một hoặc nhiều VerifyErrors sẽ phác thảo cụ thể những gì nó đã vấn đề với.

Bạn cũng chỉ có thể sử dụng thư viện android-support-v13 trên Android 3.2 trở lên (do đó có tên v13 trong tên của nó).

+0

Vừa mới viết xong. Có vẻ là vấn đề. –

+0

Chính xác! Tôi không thể tin rằng tôi đã bỏ qua điều gì đó hiển nhiên! Cảm ơn nhiều! Ngoài ra, tôi sử dụng phiên bản v13 của thư viện tương thích googlemaps của Pete Doyle và nó cũng bao gồm v4, vì vậy tôi nghĩ rằng đó không phải là vấn đề (và không phải lúc tôi chuyển nhập). –

+0

Ah vâng. Nó là một bổ sung (thay vì một thay thế hoàn toàn) của phiên bản v4 bao gồm một bộ chuyển đổi máy nhắn tin đặc biệt mà dính một chút gần gũi hơn với khuôn khổ để tối ưu hóa. Miễn là bạn không sử dụng nó, bạn sẽ tốt hơn. –

19

Không được chấp nhận: Tôi đoán sự cố sẽ biến mất với Google Maps Android API v2. Nếu bạn quyết định sử dụng phiên bản không dùng nữa, giải pháp bên dưới.


Vì vậy, Jake đã trả lời chính xác vấn đề, nhưng tôi nghĩ rằng nó sẽ hữu ích cho ai đó để có một cách chi tiết hơn hoặc ít chi tiết hơn. Vậy làm thế nào để làm cho ActionBarSherlock hoạt động với bản đồ?

Tôi cho rằng bạn đã thiết lập ActionBarSherlock và làm việc như một dự án thư viện, bạn có thể tìm thấy nhiều hướng dẫn về cách thực hiện.

Nếu bạn chỉ muốn sử dụng MapActivity với ActionBarSherlock - thật dễ dàng:

  1. Tải Jake MapsPlugin https://github.com/JakeWharton/ActionBarSherlock-Plugin-Maps,
  2. Đặt nó trong thư mục libs của ứng dụng của bạn và bao gồm nó trong build path.

Nếu bạn muốn sử dụng MapView với các tính năng Honeycomb như mảnh vỡ hoặc bốc hàng:

  1. Tải về gói hỗ trợ android Pete Doyle với bản đồ google: https://github.com/petedoyle/android-support-v4-googlemaps,
  2. Thực hiện một lọ (nếu bạn tải về trước lọ nhỏ gọn nó chỉ là một vấn đề đổi tên zip để jar, trong trường hợp bạn không biết). Bạn có thể tải phiên bản v13, bao gồm v4,
  3. Tạo một bản sao thư viện ActionBarSherlock trong không gian làm việc (đặt tên là ActionBarSherlockMaps hoặc một cái gì đó tương tự), không gây rối với bản gốc, bạn có thể phải sử dụng nó sau hoặc một cái gì đó,
  4. Hãy nhớ xây dựng cả ActionBarSherlockMaps và dự án của bạn dựa trên các API Google mới nhất. Nếu bạn sử dụng Android 4.0.3 thông thường mà không có API Google, nó sẽ không hoạt động
  5. Đặt bình (ví dụ android-support-v13-r7-googlemaps.jar) vào thư mục libs của ActionBarSherlockMaps mới, loại trừ hỗ trợ android -v4.jar từ đường dẫn xây dựng và bao gồm android-support-v13-r7-googlemaps.jar
  6. Với bản sửa đổi 7, bạn sẽ gặp lỗi biên dịch trong bước này trong SherlockFragmentActivity. Tìm protected void supportInvalidateOptionsMenu() và thay đổi mức độ hiển thị thành public (bước này không cần thiết trong phiên bản ABS mới)
  7. Đặt cùng một bình trong thư mục libs của dự án, loại trừ android-support-v4.jar khỏi đường dẫn xây dựng và bao gồm android-support-v13-r7-googlemaps.jar
  8. Đảm bảo bạn đặt <uses-library android:name="com.google.android.maps" /> vào thẻ ứng dụng của tệp kê khai
  9. Đảm bảo bạn sử dụng đúng nhập cho các đoạn, bộ nạp và nội dung! Bạn nên sử dụng ví dụ: import android.support.v4.app.LoaderManager; insted của import android.app.LoaderManager;
  10. Thưởng thức ActionBarSherlock + Google Maps + Những mảnh vỡ + Máy bốc hàng

Đó là cách giải quyết tốt nhất cho bây giờ, cho đến khi Google đưa bản đồ trong thư viện tương thích. Tôi hy vọng họ sẽ làm điều đó trước 4. * thiết bị vượt quá 2. * ...

+1

Công trình này tuyệt vời! Sử dụng ABS v4.2.0 bướC# 6 (thay đổi khả năng hiển thị của supportInvalidateOptionsMenu) là không cần thiết mặc dù ... – Mudar

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