[Android] ViewFlipper “Receiver not registered” 的 bug

又抓到一個bug了,真開心

這次是Android自己本身控件的問題

有使用到ViewFlipper的朋友注意了

 

如果最近有遇到這個bug

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@464946a0

at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:814)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104)
at android.view.View.dispatchDetachedFromWindow(View.java:6033)
…….(略刪)

網友看過source code 發現是google本身控件的Bug

可以用以下,最簡單的方式可以這樣解決

—————————————————————————-

解決方式

建立一個package名字叫做com.J_Test.temp

建立一個class名稱叫做myViewFlipper 

貼上其程式碼

 

package
com.J_Test.temp;

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

public class myViewFlipper extends ViewFlipper

{
     // 建立預設的建構子
     public myViewFlipper(Context context)
     {
           super(context);
     }

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

 
     @Override
     protected void onDetachedFromWindow()
     {
           // Android 2.1~2.3.4bug ()
           // 解決ViewFlipper “Receiver not
registered” Error
           try
           {
                super.onDetachedFromWindow();
           } catch (IllegalArgumentException e)
           {
                stopFlipping();
           }
     }
}

 

 

使用方式

將舊有的程式碼

   <ViewFlipper
        android:id=“@+id/flipper”
        android:layout_width=“match_parent”
        android:layout_height=“wrap_content”
        android:flipInterval=“5000”
        android:inAnimation=“@anim/push_up_in”
        android:outAnimation=“@anim/push_up_out” >

 ………….

    </ViewFlipper>

替換掉成我們的控件

   <com.J_Test.temp.myViewFlipper
        android:id=“@+id/flipper”
        android:layout_width=“match_parent”
        android:layout_height=“wrap_content”
        android:flipInterval=“5000”
        android:inAnimation=“@anim/push_up_in”
        android:outAnimation=“@anim/push_up_out” >

 ………….

    </com.J_Test.v1.temp.myViewFlipper>

 

這樣就OK了

 

原理就是上述藍色字處有bug

我們繼承它,把super()用try-catch把他接起來

然後呼叫stopFlipping()會讓所有程序停止

 

 

—————————————————————————-

測試方式如下:

在XML做一個ViewFlipper

JAVA程式對應尋找其View

ViewFlipper mFlipper = (ViewFlipper) findViewById(R.id.flipper);

還沒有呼叫

mFlipper.startFlipping();

之前就把螢幕轉向

網友測試好像從Android 2.1就出現此bug

測試從Android 2.3.4都還仍然依舊

—————————————————————————-

 

 

參考資料

http://daniel-codes.blogspot.com/2010/05/viewflipper-receiver-not-registered.html
http://code.google.com/p/android/issues/detail?id=6191