2010-06-11 17 views
9

यदि मैं अपने मोटो Droid A855 पर कीबोर्ड को भौतिक रूप से स्लाइड करता हूं, तो यह नीचे दिए गए स्टैक ट्रेस के साथ मेरे टेस्ट ऐप को क्रैश करता है। मुझे समझ में नहीं आता क्यों?कीबोर्ड-स्लाइड मेरे ऐप को क्रैश क्यों करता है?

इसके अलावा, अगर मैं कीबोर्ड के साथ अपना ऐप शुरू करता हूं, तो मेरा ऐप स्टार्टअप पर तुरंत क्रैश हो जाता है।

ऐप में एक गतिविधि होती है, जिसमें मुख्य दृश्य लेआउट के रूप में व्यूफ़्लिपर होता है।

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 

संपादित करें: जोड़ा एक्सएमएल लेआउट और मुख्य गतिविधि से प्रासंगिक के टुकड़े viewflipper दो linearlayouts ...

स्टैक ट्रेस शामिल हैं।

पूरे एक्सएमएल लेआउट फ़ाइल मुख्य गतिविधि से

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

कोड के टुकड़े:

/** 
* 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(); 
     } 
    } 
} 

उत्तर

21

इस मुद्दे आप

  • एक नया वर्ग MyViewFlipper कहा जाता है जो ViewFlipper ओवरराइड करता है परिभाषित करना होगा
  • संदर्भ कि नया वर्ग कहीं भी आपने पहले संदर्भित है | ViewFlipper
  • हल करने के लिए (नीचे देखें) अपने वर्ग को परिभाषित करना और जैसा कि नीचे दिखाया गया है:

नई कक्षा MyViewFlipper कहा जाता है।

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(); 
     } 
    } 
} 

अब XML लेआउट में यह संदर्भित करने के लिए आपके पास ViewFlipper के इस "निर्धारित" संस्करण का उपयोग करने के लिए: निम्नलिखित शामिल हैं। चूंकि यह मूल रूप से एक "कस्टम दृश्य" है, तो आप पूरी तरह से MyViewFlipper को पैकेज पथ अर्हता प्राप्त करने के लिए है के रूप में यहां देखी गई:

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

अब ऐप अब कुंजीपटल स्लाइड घटना पर दुर्घटनाओं या एप्लिकेशन के साथ आरंभ कर रहा है, तो पहले से ही स्लाइड करें। लॉग में इस के लिए देखो:

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

क्रेडिट: http://code.google.com/p/android/issues/detail?id=6191

+0

मुझे लगता है कि मैं एक छोटे से टाइपिंग त्रुटि हुई -

+0

आप एक महत्वपूर्ण लाइन भूल रहे हैं की जरूरत है: कैच ब्लॉक में stopFlipping() फोन इतना है कि यह updateRunning फोन करेगा()। –

5

अगर आप अपनी कोड का कुछ हिस्सा प्रदान नहीं करते हैं ... वैसे भी मदद करने के लिए वास्तव में मुश्किल है, यह त्रुटि नई नहीं है और इसे हल करने के लिए कुछ कामकाज हैं (मुझे लगता है कि कुछ बग है) ... ऐसा करने का प्रयास करें:

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

यह onDetachedFromWindow ओवरराइड करने के लिए है और मुझे उम्मीद है कि यह आपके लिए काम करेगा।

+0

यदि आपको कोड की आवश्यकता है, तो इसके लिए पूछें। –

+0

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

+0

मैं कल रात यह सुधार को लागू करने की कोशिश की लेकिन यह कोई को प्रभावित किया था। सबसे पहले, ग्रहण को "संरक्षित" पसंद नहीं आया इसलिए मुझे इसे सार्वजनिक करना पड़ा। साथ ही, स्टॉपफ्लिपिंग को findviewById, आदि का उपयोग करके योग्यता प्राप्त करने की आवश्यकता है और मैंने नए कोड ब्लॉक में संदेशों को डीबग किया और पाया कि यह कभी भी फायरिंग नहीं था। –

2

मैं जानता हूँ कि इस सवाल का लगभग दो साल पहले पूछा गया था, लेकिन उसके बाद से एक बहुत ही आसान ठीक लागू किया गया है। मैनिफेस्ट में प्रत्येक गतिविधि कॉल में बस android:configChanges="orientation|keyboard|keyboardHidden" जोड़ें।

0

हाँ मुझे पहले यह बग नहीं दिखाई देता है ..लेकिन फिर मेरे पास यह मेरे मेनिफेस्ट

<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> 
संबंधित मुद्दे