android - 删除和添加 View NPE、蜂窝、android

标签 android nullpointerexception android-3.0-honeycomb add android-gallery

我有 LinearLayout areaForGalleries 以编程方式填充了 Gallery 组件,一个接一个。每个图库中的 onItemClick 方法将其从 areaForGalleries 中移除,并将其添加到 RelativeLayout parentLayout,这是 areaForGalleries 的父级。请参阅下面的代码。

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 上完美运行,但在 Honeycomb 或 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)

NullPointerException 指的是CustomGallery 方法,我完全没改:

@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 ,但我没有使用 fragment 。

有什么问题吗? 谢谢!

最佳答案

我现在这不是您正在等待的答案,但我只是在原始图库小部件(未重载)的 ICS 上遇到了同样的问题。

经过一些测试,我最终使用了简单的方法:try...catch

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

Galley 仍在正常工作,onClickListener 也是如此,因此对我来说没有副作用。

关于android - 删除和添加 View NPE、蜂窝、android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9078287/

相关文章:

java - Android Billing 如何使用 setAccountId 或将付款分配给自定义标识符

android - 如何在 Android 应用程序中按时间限制操作?

java.lang.NullPointerException 问题

java - 什么是NullPointerException,我该如何解决?

android - 在 Android 平板电脑的 map 上绘制叠加层时正确处理主线程连接上的网络

android - 在 API 1.6 上部署 VerifyError

安卓风格说明

Android:日期未显示为本地时间

android - 如何从广播接收器访问我的主要 Activity 中的 webview?

java - 抛出 NullPointerException 但我不知道如何修复它。