2014-10-24 18 views
9

Tôi đang cố gắng tạo ứng dụng cho android và tôi gặp phải sự cố sau:Lỗi ứng dụng khi nhấn nút menu

Ứng dụng gặp sự cố khi tôi nhấn nút menu. Hãy để tôi cung cấp cho bạn một số chi tiết đầu tiên.

  • Lỗi xảy ra để ONLY trên E430 với Android 4.1.2 (thử nghiệm trên bốn điện thoại khác cho đến nay)
  • Ứng dụng này bắt đầu với một màn hình giật gân và không có thanh hành động LG Optimus L3 II. Tại nút menu điểm này chỉ không làm bất cứ điều gì.
  • Với một cú chạm đơn giản, chúng tôi vượt qua màn hình giật gân và chúng tôi đi đến Hoạt động chính triển khai hoạt động ActionBar và có ngăn điều hướng.
  • Từ thời điểm này và sau đó, mỗi khi tôi cố gắng nhấp vào nút menu, ứng dụng gặp sự cố.

Dưới đây là cách bố trí của các menu và các chức năng onCreateOptionsMenu:

res/menu/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/action_settings" 
     android:title="@string/action_settings" 
     android:orderInCategory="100" 
     app:showAsAction="never" /> 
</menu> 

Phần từ MainActivity.java

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     if (!mNavigationDrawerFragment.isDrawerOpen()) { 
      // Only show items in the action bar relevant to this screen 
      // if the drawer is not showing. Otherwise, let the drawer 
      // decide what to show in the action bar. 
      getMenuInflater().inflate(R.menu.main, menu); 
      restoreActionBar(); 
      return true; 
     } 
     return super.onCreateOptionsMenu(menu); 
    } 

Xin lưu ý mã này được tạo từ Android Studio.

Cho đến nay những gì tôi đã cố gắng:

  • Cố gắng nhìn vào tập tin đó có vấn đề từ các nguồn sdk (API Level 16 và 21) nhưng họ không liên quan đến stack trace (dòng được hiển thị trong dấu vết ngăn xếp được chỉ ra ở một vị trí không có ý nghĩa).
  • Đã cố gắng cài đặt bản sửa lỗi XPosed cho lỗi Google PlayStore với lỗi nút menu. Không có gì ở đây cả.
  • Tìm thấy một báo cáo lỗi tương tự với hệ thống báo lỗi của firefox vì vậy tôi đã cố gắng cài đặt Firefox và xem nó có treo trên điện thoại của tôi khi tôi bấm Menu Button hay không; firefox không sụp đổ. (Link to firefox's bug)

Đây là stack trace từ LogCat:

10-24 09:08:02.710 4712-4712/com.scaryboxstudios.unrealestateapp E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at com.android.internal.policy.impl.PhoneWindow.onKeyUpPanel(PhoneWindow.java:1004) 
      at com.android.internal.policy.impl.PhoneWindow.onKeyUp(PhoneWindow.java:1712) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2125) 
      at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3611) 
      at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3581) 
      at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2831) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4929) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
      at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 
      at dalvik.system.NativeStart.main(Native Method) 
+2

Tìm thấy vấn đề đệ trình chống lại các thư viện hỗ trợ: https://code.google.com/p/android/vấn đề/chi tiết? id = 78.154 – TalkLittle

+0

@TalkLittle Cảm ơn! Tôi sẽ theo dõi điều đó! – TheCrafter

+1

Cùng một vấn đề về LG L9 với 4.1.2 –

Trả lời

0

Sau khi vấp ngã cùng một vấn đề gần đây tôi đã tìm thấy gốc của sự cố. Vấn đề là vấn đề tương thích giữa các thư viện hỗ trợ cũ hơn và mới hơn. Dường như tôi đã sử dụng những thứ bị khấu hao xung quanh mã của tôi cùng với các công cụ mới hơn.

Tôi xin lỗi vì đã loại trừu tượng nhưng câu hỏi này là 4 tháng tuổi và tôi không thể nhớ chính xác những gì là những dòng không chính xác mã. Nếu bộ nhớ phục vụ đúng, vấn đề nằm trên các phương thức được tạo tự động từ Android Studio cho các hoạt động ngăn kéo ứng dụng. Tôi đã từng dự án mẫu Drawer Application từ Android Studio và tôi đã chọn để hỗ trợ API Android rất cũ quá nên Android Studio đã chọn khấu hao Thư viện hỗ trợ Android.

Vấn đề là tôi giải quyết vấn đề khi tôi refactored mã để sử dụng các kỹ thuật phi khấu hao chỉ.

Nếu bạn đang đấu tranh chống lại một vấn đề tương tự tôi khuyên loại bỏ tất cả những gì Android Studio (tôi giả sử rằng bạn sử dụng Android Studio hoặc Eclipse) dấu ngoặc như khấu hao.

2

Cập nhật: Với phiên bản Appcompat-v7 22.0.0, onKeyUp dường như không để bắn cho phím Menu. Lỗi ban đầu dường như đã được sửa, vì vậy tôi có khả năng sẽ xóa giải pháp menu con. Rất tiếc, tôi chưa xác minh bản sửa lỗi trên thiết bị LG 4.1 bị ảnh hưởng.


tôi đã kết thúc làm một workaround cho điều này, mà người dùng được thông báo đã khắc phục sự cố cho họ.

Triển khai menu phụ thay vì dựa vào menu mục bổ sung. Thông báo trước cho điều này là bây giờ mọi thiết bị sẽ thấy nút tràn trong Thanh tác vụ ngay cả khi chúng có phím Menu.

Kỹ thuật sau đây là từ https://stackoverflow.com/a/18530179/57490

  1. Chuyển đổi tất cả các mục trình đơn tùy chọn tràn tới các menu con.

  2. Ghi đè onKeyUp trong hoạt động của bạn, yêu cầu gọi số Menu.performIdentifierAction(R.id.menu_overflow, 0); và không gọi super.onKeyUp cho keyCode == KEYCODE_MENU.

+0

Cảm ơn câu trả lời của TalkLittle. Những gì bạn nói là đúng tất nhiên, nhưng tôi không cần một cách giải quyết. Thực tế, việc ghi đè onKeyUp là điều đầu tiên tôi nghĩ. Vấn đề chính là tìm gốc rễ của vấn đề này và một cách chính xác để sửa chữa nó. Không phải là cách để tránh nó !! – TheCrafter

0

Ngoài ra để bắt nút Menu có thể sử dụng tiếp theo:

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) { 


     // TODO - Your user code 

     /* 
     if (event.getAction() == KeyEvent.ACTION_DOWN 
       && event.getRepeatCount() == 0) { 

      // Tell the framework to start tracking this event. 
      //getKeyDispatcherState().startTracking(event, this); 
      return true; 

     } else if (event.getAction() == KeyEvent.ACTION_UP) { 

      // getKeyDispatcherState().handleUpEvent(event); 
      if (event.isTracking() && !event.isCanceled()) { 

       // DO BACK ACTION HERE 
       return true; 

      } 
     }*/ 

     // if you don't want use system listener 
     // return super.dispatchKeyEvent(event); 
     return false; 

    } else { 
     return super.dispatchKeyEvent(event); 
    } 
} 

Làm việc cho mới nhất AppCompat và SDK phiên bản - 22,0

+0

Vâng, điều đó sẽ hiệu quả nhưng được tính là "giải pháp". Như tôi đã nói trong câu trả lời của TalkLittle dưới đây, tôi đã tìm thấy nhiều cách giải quyết. Nhưng tôi đã tò mò cho các giải pháp thực tế và/hoặc gốc của vấn đề. Cảm ơn câu trả lời của bạn mặc dù! – TheCrafter

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