2015-01-26 84 views
1

我試圖實現一個可變形的相對佈局。所以,我實現這個代碼: -空指針異常,當我點擊setOnTouchListener

body.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // pass all touch events to the implementation 
      boolean consumed = false; 
      // handle move and bring to front 
      consumed = context.onTouchHandleMove(id, Window.this, v, event)|| consumed; 
      // alert implementation 
     consumed = context.onTouchBody(id, Window.this, v, event)|| consumed; 
     Log.e("Now touched ","Now in touch "+consumed); 
      return consumed; 
     } 
    }); 

當我拖我的看法,它的作品prefectly,但是當我點擊我得到空指針異常。

01-26 13:45:21.260: E/AndroidRuntime(980): FATAL EXCEPTION: main 
    01-26 13:45:21.260: E/AndroidRuntime(980): java.lang.NullPointerException 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.View.onAttachedToWindow(View.java:11709) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.View.dispatchAttachedToWindow(View.java:12125) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2450) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1207) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.Choreographer.doFrame(Choreographer.java:532) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.os.Handler.handleCallback(Handler.java:730) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.os.Handler.dispatchMessage(Handler.java:92) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.os.Looper.loop(Looper.java:137) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at android.app.ActivityThread.main(ActivityThread.java:5103) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at java.lang.reflect.Method.invokeNative(Native Method) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at java.lang.reflect.Method.invoke(Method.java:525) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    01-26 13:45:21.260: E/AndroidRuntime(980): at dalvik.system.NativeStart.main(Native Method) 

我在做什麼錯在這裏?

+0

你能標出782線嗎? – AlexR 2015-01-26 18:19:42

+0

我沒有。這是Android的運行時代碼錯誤View.java – 2015-01-26 18:22:09

+0

哦,對不起,我沒有注意。我不熟悉android,但首先檢查2(onTouchHandleMove或onTouchBody)的哪個調用是負責的,然後檢查其中一個參數是否爲空,並確保這正是你想要的 – AlexR 2015-01-26 18:25:42

回答

0

聲明全局布爾boolean clickToBe = false

body.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     // pass all touch events to the implementation 
     if(event.getAction() == MotionEvent.ACTION_DOWN){ 
      clickToBe = true; 
     }else if(event.getAction() == MotionEvent.ACTION_UP){ 
       if(clickToBe) 
        return false; v.performClick(); // if you want onclick listeners 
      } else 

     if(event.getAction() == MotionEvent.ACTION_MOVE){ 
     clickToBe = false    
     boolean consumed = false; 
     // handle move and bring to front 
     consumed = context.onTouchHandleMove(id, Window.this, v, event)|| consumed; 
     // alert implementation 
    consumed = context.onTouchBody(id, Window.this, v, event)|| consumed; 
    Log.e("Now touched ","Now in touch "+consumed); 
     return consumed; 
    } 
    } 

}); 

先生,請檢查格式和關閉,我做到了不牢記這一點,讓我,如果這也有助於

+0

類型StandOutWindow中的方法onTouchHandleMove(int,Window,View,MotionEvent)不適用於參數(int,IBinder,View,MotionEvent) – 2015-01-26 20:32:31

+0

yea,i tot so,sorry @ankuragarwal – Elltz 2015-01-26 20:38:38

+0

檢查我的編輯Sir,@ankuragarwal – Elltz 2015-01-26 21:00:57

0

試試這個:

context =this; 
body.setOnTouchListener(new OnTouchListener() { 
@Override 
public boolean onTouch(View v, MotionEvent event) { 
// pass all touch events to the implementation 
boolean consumed = false; 
// handle move and bring to front 
if (context==null){ 
return;} 
consumed = context.onTouchHandleMove(id, Window.this, v, event)|| consumed; 
// alert implementation 
consumed = context.onTouchBody(id, Window.this, v, event)|| consumed; 
Log.e("Now touched ","Now in touch "+consumed); 
return consumed; 
} 
}); 
+0

仍然得到相同的例外 – 2015-01-27 17:21:37