3

我有LinearLayout areaForGalleries編程用Gallery組件一個接一個地填充。每個圖庫中的onItemClick方法將其從areaForGalleries中移除並將其添加到areaForGalleries的父親RelativeLayout parentLayout。見下面的代碼。刪除並添加視圖NPE,蜂窩,android

LinearLayout areaForGalleries; 
RelativeLayout parentLayout; 

... 
private void showGallery() { 
final CustomGallery mGallery = new CustomGallery(mContext); 

mGallery.setOnItemClickListener(new CustomAdapterView.OnItemClickListener() { 
     public void onItemClick(CustomAdapterView<?> parent, View v, int position, long id) { 
      areaForGalleries.removeView(mGallery); 
      parentLayout.addView(mGallery); 
     } 
    }); 

CustomGallery是我實現的Android Gallery組件。我只改變了畫廊的左側 - 一行代碼已經改變。 代碼完美的作品在Android 2.1 - 2.3.3,但是當試圖在蜂窩或ICS其與以下錯誤崩潰:

01-31 10:31:49.596: E/AndroidRuntime(1536): FATAL EXCEPTION: main 
01-31 10:31:49.596: E/AndroidRuntime(1536): java.lang.NullPointerException 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.GestureDetector.onTouchEvent(GestureDetector.java:587) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at com.my.example.pullrefreshgallery.CustomGallery.onTouchEvent(CustomGallery.java:812) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.View.dispatchTouchEvent(View.java:5486) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1714) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1892) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.app.Activity.dispatchTouchEvent(Activity.java:2364) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at com.my.example.Home.dispatchTouchEvent(Home.java:883) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1840) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.View.dispatchPointerEvent(View.java:5662) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2863) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.os.Looper.loop(Looper.java:137) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at android.app.ActivityThread.main(ActivityThread.java:4340) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-31 10:31:49.596: E/AndroidRuntime(1536):  at dalvik.system.NativeStart.main(Native Method) 

NullPointerExceptionCustomGallery方法,這是我沒有改變:

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    // Give everything to the gesture detector 
    boolean retValue = mGestureDetector.onTouchEvent(event); 

    int action = event.getAction(); 
    if (action == MotionEvent.ACTION_UP) { 
     // Helper method for lifted finger 
     onUp(); 
    } else if (action == MotionEvent.ACTION_CANCEL) { 
     onCancel(); 
    } 

    return retValue; 

} 

當我註釋掉刪除並添加的行mGallery一切正常完美! 有similar problem,但我沒有使用片段。

任何想法是什麼錯? 謝謝!

回答

6

我現在不是你正在等待的答案,但我只在原畫廊小部件上的ICS上有同樣的問題(未超載)。

一些測試後,我fnally使用簡單的方法:的try ... catch

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    try { 
     return super.onTouchEvent(event); 
    } catch (Throwable t) { 
     return true; 
    } 
} 

廚房仍在正常工作,所以是onClickListener所以對我來說沒有任何副作用。

+2

+1對我有用 – Ajay 2012-07-17 11:59:49