2010-06-11 6 views
9

Nếu tôi trượt bàn phím trên chiếc Moto Droid A855 của mình, nó sẽ treo ứng dụng thử nghiệm của tôi với dấu vết ngăn xếp được dán dưới đây. Tôi không hiểu tại sao?Tại sao trượt bàn phím trượt ứng dụng của tôi?

Ngoài ra, nếu tôi khởi động ứng dụng bằng bàn phím, ứng dụng của tôi sẽ gặp sự cố ngay khi khởi động.

Ứng dụng bao gồm một hoạt động, trong đó có một trình xem như bố cục chế độ xem chính. Các viewflipper chứa hai linearlayouts ...

Stack trace:

06-10 21:10:17.652 E/AndroidRuntime(3785): Uncaught handler: thread main exiting due to uncaught exception 
06-10 21:10:17.668 E/AndroidRuntime(3785): java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:667) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.app.ApplicationContext.unregisterReceiver(ApplicationContext.java:747) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:321) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.View.dispatchDetachedFromWindow(View.java:5835) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1076) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1570) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.ViewRoot.doDie(ViewRoot.java:2556) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.ViewRoot.die(ViewRoot.java:2526) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.view.Window$LocalWindowManager.removeViewImmediate(Window.java:436) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3498) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3599) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.app.ActivityThread.access$2300(ActivityThread.java:119) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1867) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.os.Looper.loop(Looper.java:123) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at java.lang.reflect.Method.invoke(Method.java:521) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
06-10 21:10:17.668 E/AndroidRuntime(3785):  at dalvik.system.NativeStart.main(Native Method) 
06-10 21:10:17.684 I/Process (1017): Sending signal. PID: 3785 SIG: 3 

EDIT: thêm layout XML và đoạn có liên quan từ hoạt động chính.

Toàn bộ file layout XML

<?xml version="1.0" encoding="utf-8"?> 


<ViewFlipper 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/vFlipper" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

       <!-- Linear Layout 1: messages and overview. --> 
       <LinearLayout 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        > 

       <TableRow android:id="@+id/TableRow01" android:layout_width="fill_parent" android:layout_height="wrap_content"> 
       <TextView 
         android:text="Connection info" 
         android:id="@+id/tvCon1" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:background="#F0F0F0" 
         android:textColor="#FF0000" 
         /> 
       </TableRow> 


       <ScrollView 
         android:id="@+id/ScrollView01" 
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent"> 

           <TextView 
             android:id="@+id/tvMessages" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent" 
            android:text="" 
            /> 

       </ScrollView> 

     </LinearLayout> 


     <!-- Linear Layout 2: settings --> 
     <LinearLayout 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        > 


       <TableRow 
         android:id="@+id/TableRow03" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content"> 

           <TextView 
           android:text="hello world" 
           android:id="@+id/asdfasdf2" 
           android:layout_width="fill_parent" 
           android:layout_height="wrap_content" 
           /> 
       </TableRow>     

     </LinearLayout> 

</ViewFlipper> 

Đoạn mã từ Hoạt động chính:

/** 
* Attempt (not currently working) to work around this bug: http://code.google.com/p/android/issues/detail?id=6191 
* TODO: make it work. 
*/ 
@Override 
public void onDetachedFromWindow() { 
     Log.d("Dash","OnDetachedFromWindow()"); 

     try { 
     super.onDetachedFromWindow(); 
    } 
    catch (Exception e) { 
     ViewFlipper v = (ViewFlipper)findViewById(R.id.vFlipper); 
     if (v != null) { 
       Log.d("Dash","De-Bug hit. e=" + e.getMessage()); 
       v.stopFlipping(); 
     } 
    } 
} 

Trả lời

21

Để giải quyết vấn đề này, bạn phải

  • Định nghĩa một lớp mới gọi là MyViewFlipper mà đè ViewFlipper (xem dưới đây)
  • Reference rằng lớp mới bất cứ nơi nào bạn có thể đã từng tham chiếu ViewFlipper
  • Xác định lớp học của bạn và bố cục như được hiển thị bên dưới:

Lớp mới có tên MyViewFlipper. Bao gồm những điều sau đây:

package com.gtosoft.dash; // change this to match your own app. 

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.widget.ViewFlipper; 

public class MyViewFlipper extends ViewFlipper { 

    public MyViewFlipper(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     try{ 
      super.onDetachedFromWindow(); 
     }catch(Exception e) { 
      Log.d("MyViewFlipper","Stopped a viewflipper crash"); 
      stopFlipping(); 
     } 
    } 
} 

Bây giờ, hãy sử dụng phiên bản "cố định" ViewFlipper này bạn phải tham chiếu nó trong bố cục xml. Vì nó là cơ bản một "giao diện tùy chỉnh", bạn phải hội đủ điều kiện đầy đủ đường dẫn package để MyViewFlipper, như đã thấy ở đây:

<com.gtosoft.dash.MyViewFlipper 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/vFlipper" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    (insert all the other old layout code here) 

</com.gtosoft.dash.MyViewFlipper> 

Bây giờ ứng dụng không còn bị treo trên các sự kiện trượt bàn phím hoặc nếu ứng dụng được bắt đầu với trang trình bày đã hết. Tìm kiếm này trong nhật ký:

06-11 20:08:15.811 D/MyViewFlipper(6106): Stopped a viewflipper crash 

Credit: http://code.google.com/p/android/issues/detail?id=6191

+0

Tôi nghĩ rằng tôi đã thực hiện một lỗi nhỏ -

+0

Bạn đang thiếu một dòng quan trọng: gọi stopFlipping() trong khối catch để nó sẽ gọi updateRunning(). –

5

Nó thực sự khó khăn để giúp bạn nếu bạn không cung cấp một số phần của mã của bạn ... dù sao, lỗi này không phải là mới và có một số cách giải quyết để giải quyết nó (tôi đoán là một số lỗi) ... cố gắng làm điều này:

@Override 
protected void onDetachedFromWindow() { 
    try { 
     super.onDetachedFromWindow(); 
    } 
    catch (IllegalArgumentException e) { 
     stopFlipping(); 
    } 
} 

Điều này là để ghi đè số onDetachedFromWindow và tôi hy vọng nó hoạt động cho bạn.

+0

Nếu bạn cần mã, hãy yêu cầu. –

+0

http://code.google.com/p/android/issues/detail?id=6191 –

+0

Tôi đã cố gắng triển khai bản sửa lỗi này tối qua nhưng không ảnh hưởng gì. Trước hết, Eclipse không thích "bảo vệ" vì vậy tôi phải công khai nó. Ngoài ra, stopFlipping cần thiết để được đủ điều kiện bằng cách sử dụng findviewById, v.v. Và tôi đặt các thông báo gỡ lỗi trong khối mã mới và thấy rằng nó thậm chí không bắn, bao giờ hết. –

2

Tôi biết câu hỏi này đã được hỏi gần hai năm trước đây, nhưng kể từ đó một sửa chữa rất dễ dàng đã được thực hiện. Chỉ cần thêm android:configChanges="orientation|keyboard|keyboardHidden" vào từng cuộc gọi Hoạt động trong Tệp kê khai.

0

vâng tôi không thấy lỗi này trước khi ..nhưng sau đó một lần nữa tôi có điều này trong tệp kê khai của tôi

<activity 
     android:name=".MainActivity" 
     android:configChanges="keyboardHidden|navigation" 
     android:label="@string/app_name" 
     android:launchMode="singleTop" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 

</activity>