又抓到一個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.4的bug ()
// 解決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
留言列表