簡體   English   中英

在4.0上使用onTouchListener和onClickListener的Android TextView NullPointerException

[英]Android TextView NullPointerException with onTouchListener and onClickListener on 4.0

我有一個TextView,我已經分配了onTouchListener和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
    }
});

onTouchListener將檢測手勢檢測器的onFling()。 這個代碼沒有任何問題,除了Android 4.0(冰淇淋三明治)。 使用4.0,我在“_gestureDetector.onTouchEvent(event);”上收到NullPointerException。 (當我試圖逃跑時)。

但是,如果我注釋掉onClickListener,則fling將起作用,我將不會收到NullPointerException。

我假設如果觸摸偵聽器都返回false,則不會消耗該事件,從而允許兩者都工作。

有沒有人有任何想法? 謝謝!

這是我的更多代碼:

 /** 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;
    }
}

堆棧跟蹤:

 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)

我的朋友,當你從_gestureDetector獲得你想要處理的事件時,嘗試返回true:

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

否則,返回false。

我看了一下GestureDetector的Android源代碼(4.0.1 r1): http ://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android /view/GestureDetector.java?av=f

第587行似乎不是問題的根源,因為mVelocityTracker總是被該點初始化。 你知道你有4.0的哪個版本?

這可能是4.0中的一個錯誤,我會在這里向他們提交一個錯誤報告:

http://code.google.com/p/android/issues/list

同時,您是否可以將OnClickListener中的代碼移動到SimpleGestureListener的OnSingleTapConfirmed方法中? 這樣,它應該仍然做正確的事情,就好像你的點擊監聽器被注釋掉了,但你得到了相同的行為。

http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html#onSingleTapConfirmed(android.view.MotionEvent)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM