Я пишу код Android для обработки ввода джойстика, и простой случай работает нормально, но когда я пытаюсь передать MotionEvent методу класса , я получаю:Pass MotionEvent от функции обратного вызова к методу класса, вызывающего «событие ввода диспетчера исключений»
09-01 10:36:48.358: E/InputEventReceiver(8079): Exception dispatching input event.
09-01 10:36:48.358: D/AndroidRuntime(8079): Shutting down VM
09-01 10:36:48.358: W/dalvikvm(8079): threadid=1: thread exiting with uncaught exception (group=0x418f32a0)
09-01 10:36:48.368: E/AndroidRuntime(8079): FATAL EXCEPTION: main
09-01 10:36:48.368: E/AndroidRuntime(8079): java.lang.NullPointerException
09-01 10:36:48.368: E/AndroidRuntime(8079): at com.example.inputtest.MainActivity.onGenericMotionEvent(MainActivity.java:60)
09-01 10:36:48.368: E/AndroidRuntime(8079): at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2435)
09-01 10:36:48.368: E/AndroidRuntime(8079): at
код, который работает:
package com.example.inputtest;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MotionEvent;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView outp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
outp = (TextView) findViewById(R.id.outp);
outp.setText((CharSequence) "No input yet");
}
@Override
public boolean onGenericMotionEvent(MotionEvent mevt){
outp.setText((CharSequence) "MotionEvent");
if (mevt.getAction() == MotionEvent.ACTION_MOVE) {
outp.setText((CharSequence) String.valueOf(mevt.getAxisValue(MotionEvent.AXIS_X)));
return true;
}
return false;
}
}
код, который не делает:
package com.example.inputtest;
import android.os.Bundle;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MotionEvent;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView outp;
private wikipadController wikipadController = new wikipadController();
private class wikipadController {
private float leftJoyX, leftJoyY, rightJoyX, rightJoyY;
public wikipadController(){
leftJoyX =0;
leftJoyY = 0;
rightJoyX = 0;
rightJoyY = 0;
}
public void update(MotionEvent mevt){
leftJoyX=mevt.getAxisValue(MotionEvent.AXIS_X);
leftJoyY=mevt.getAxisValue(MotionEvent.AXIS_Y);
rightJoyX=mevt.getAxisValue(MotionEvent.AXIS_Z);
rightJoyY=mevt.getAxisValue(MotionEvent.AXIS_RZ);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
outp = (TextView) findViewById(R.id.outp);
outp.setText((CharSequence) "No input yet");
}
@Override
public boolean onGenericMotionEvent(MotionEvent mevt){
outp.setText((CharSequence) "MotionEvent");
if (mevt.getAction() == MotionEvent.ACTION_MOVE) {
wikipadController.update(mevt);
outp.setText(String.format("left: %d, %d right: %d, %d",
wikipadController.leftJoyX,
wikipadController.leftJoyY,
wikipadController.rightJoyX,
wikipadController.rightJoyY));
return true;
}
return false;
}
}
Можете ли вы пройти мимо MotionEvent? Нужно ли его копировать или что-то еще?
Ну, это работает! Почему бы мне не получить более разумную ошибку, т. Е. Что делает это исключение NullPointerException? – foobarbecue
@foobarbecue Я бы ожидал увидеть здесь «IllegalArgumentException». Можете ли вы просмотреть свой Logcat? У вас должно было быть 'IllegalArgumentException', которое (возможно) _led_ для NPE. – Vikram