Android的TextView的NullPointerException异常与onTouchListener和onClickListener上4.0 [英] Android TextView NullPointerException with onTouchListener and onClickListener on 4.0

查看:226
本文介绍了Android的TextView的NullPointerException异常与onTouchListener和onClickListener上4.0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我已经指派既是onTouchListener和onClickListener一个TextView:

  myTextView.setOnTouchListener(新OnTouchListener(){
    公共布尔onTouch(视图V,MotionEvent事件){
        _gestureDetector.onTouchEvent(事件);
        返回false;
    }
});myTextView.setOnClickListener(新OnClickListener(){
    公共无效的onClick(视图v){
        //显示Toast通知
    }
});

该onTouchListener将检测手势检测器的onFling()。这code工作没有任何问题,除了搭载Android 4.0(冰淇淋三明治)。有了4.0,我收到一个NullPointerException异常_gestureDetector.onTouchEvent(事件); (当我尝试一扔)。

如果我注释掉onClickListener,然而,一扔会工作,我将不会收到一个NullPointerException异常。

我是假设,如果两个触摸听者返回假,事件将不被消耗下,允许两个工作

有没有人有什么想法?谢谢!

下面是我更code的:

  / **第一次创建活动时调用。 * /
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.calendar);
    _gestureDetector =新GestureDetector(新GestureListener());}私有类GestureListener扩展SimpleOnGestureListener {
    @覆盖
    公共布尔onDown(MotionEvent五){
        返回false;
    }    @覆盖
    公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,
            浮动velocityY){        如果(e1.getY() - e2.getY()> SWIPE_MIN_DISTANCE
                &功放;&安培; Math.abs(velocityY)GT; SWIPE_THRESHOLD_VELOCITY){
            //底部到顶部            _calendarTableLayout.removeAllViews();            INT月= _calendar.get(的Calendar.MONTH);            _calendar.set(的Calendar.MONTH,月+ 1);
            _calendar.set(Calendar.DATE,1); //重要            drawCalendar();            返回true;
        }否则如果(e2.getY() - e1.getY()> SWIPE_MIN_DISTANCE
                &功放;&安培; Math.abs(velocityY)GT; SWIPE_THRESHOLD_VELOCITY){
            // 从上到下            _calendarTableLayout.removeAllViews();            INT月= _calendar.get(的Calendar.MONTH);            _calendar.set(的Calendar.MONTH,月 - 1);
            _calendar.set(Calendar.DATE,1); //重要            redrawCalendar();            返回true;
        }        返回false;
    }    @覆盖
    公共无效onLong preSS(MotionEvent五){
        // 没做什么
    }    @覆盖
    公共布尔onScroll(MotionEvent E1,E2 MotionEvent,
            浮distanceX,浮distanceY){
        // 没做什么
        返回false;
    }    @覆盖
    公共无效昂秀preSS(MotionEvent五){
        // 没做什么
    }    @覆盖
    公共布尔onSingleTapUp(MotionEvent五){
        // 没做什么
        返回false;
    }
}

堆栈跟踪:

 十一月1日至27日:12:16.406:E / AndroidRuntime(1448):致命异常:主要
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):显示java.lang.NullPointerException
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.GestureDetector.onTouchEvent(GestureDetector.java:587)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在com.my.package.MyActivity $ 9.onTouch(MyActivity.java:287)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.View.dispatchTouchEvent(View.java:5481)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1892)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.app.Activity.dispatchTouchEvent(Activity.java:2364)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1840)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.View.dispatchPointerEvent(View.java:5662)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2863)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.os.Handler.dispatchMessage(Handler.java:99)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.os.Looper.loop(Looper.java:137)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在android.app.ActivityThread.main(ActivityThread.java:4340)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在java.lang.reflect.Method.invokeNative(本机方法)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在java.lang.reflect.Method.invoke(Method.java:511)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
 11月1日至27日:12:16.406:E / AndroidRuntime(1448):在dalvik.system.NativeStart.main(本机方法)


解决方案

我的朋友,尽量返回true,当你得到你想要从_gestureDetector来处理事件:

 公共布尔onTouch(视图V,MotionEvent事件){
     如果(_gestureDetector.onTouchEvent(事件)){
         返回true;
     }
     返回false;
 }

否则,返回false。

I have a TextView which I've assigned both an onTouchListener and an onClickListener:

myTextView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        _gestureDetector.onTouchEvent(event);
        return false;
    }
});

myTextView.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        // Show Toast Notification
    }
});

The onTouchListener will detect an onFling() for the gesture detector. This code works without any problems EXCEPT for Android 4.0 (Ice cream sandwich). With 4.0, I receive a NullPointerException on "_gestureDetector.onTouchEvent(event);" (when I try to fling).

If I comment out the onClickListener, however, the fling will work and I will not receive a NullPointerException.

I was under the assumption that if both the touch listener returned false, the event would not be consumed, allowing both to work.

Does anyone have any ideas? Thanks!

Here is more of my code:

 /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.calendar);


    _gestureDetector = new GestureDetector(new GestureListener());

}

private class GestureListener extends SimpleOnGestureListener {
    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {

        if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            // Bottom to top

            _calendarTableLayout.removeAllViews();

            int month = _calendar.get(Calendar.MONTH);

            _calendar.set(Calendar.MONTH, month + 1);
            _calendar.set(Calendar.DATE, 1); // important

            drawCalendar();

            return true;
        } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            // Top to bottom

            _calendarTableLayout.removeAllViews();

            int month = _calendar.get(Calendar.MONTH);

            _calendar.set(Calendar.MONTH, month - 1);
            _calendar.set(Calendar.DATE, 1); // important

            redrawCalendar();

            return true;
        }

        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        // Do nothing
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
            float distanceX, float distanceY) {
        // Do nothing
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        // Do nothing
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // Do nothing
        return false;
    }
}

Stacktrace:

 01-27 11:12:16.406: E/AndroidRuntime(1448): FATAL EXCEPTION: main
 01-27 11:12:16.406: E/AndroidRuntime(1448): java.lang.NullPointerException
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      android.view.GestureDetector.onTouchEvent(GestureDetector.java:587)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      com.my.package.MyActivity$9.onTouch(MyActivity.java:287)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      android.view.View.dispatchTouchEvent(View.java:5481)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1892)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.app.Activity.dispatchTouchEvent(Activity.java:2364)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:     1840)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.View.dispatchPointerEvent(View.java:5662)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2863)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.os.Handler.dispatchMessage(Handler.java:99)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.os.Looper.loop(Looper.java:137)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at android.app.ActivityThread.main(ActivityThread.java:4340)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at java.lang.reflect.Method.invokeNative(Native Method)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at java.lang.reflect.Method.invoke(Method.java:511)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at      com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
 01-27 11:12:16.406: E/AndroidRuntime(1448):    at dalvik.system.NativeStart.main(Native Method)

解决方案

My friend, try to return true when you get events you want to handle from _gestureDetector:

 public boolean onTouch(View v, MotionEvent event) {
     if (_gestureDetector.onTouchEvent(event)) {
         return true;
     }
     return false;
 }

Otherwise, return false.

这篇关于Android的TextView的NullPointerException异常与onTouchListener和onClickListener上4.0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆