Android 调用onTouch时,gestureListener为null
由于某种原因,当用户从左向右乱扔时,我的应用程序第一次崩溃。但如果他们从右到左抛,效果很好。 它只在我构建的gridView上执行此操作。我的布局基本上是 家长:线性布局 子:GridView 我试图为整个屏幕实现gestureListener,但是如果我为gridView所在的linearLayout实现gestureListener,它不会注册。所以我必须分开做。当我这样做时,我在gridView的firstAction gestureListener上得到一个空指针。。这是密码Android 调用onTouch时,gestureListener为null,android,android-gesture,Android,Android Gesture,由于某种原因,当用户从左向右乱扔时,我的应用程序第一次崩溃。但如果他们从右到左抛,效果很好。 它只在我构建的gridView上执行此操作。我的布局基本上是 家长:线性布局 子:GridView 我试图为整个屏幕实现gestureListener,但是如果我为gridView所在的linearLayout实现gestureListener,它不会注册。所以我必须分开做。当我这样做时,我在gridView的firstAction gestureListener上得到一个空指针。。这是密码 //set
//set swipe listener for the calendar view
calendar.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
return gestures.onTouchEvent(event);
}
});
//set swipe listener for rest of the view
mainView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
return gestures.onTouchEvent(event);
}
});
@Override
public boolean onFling(MotionEvent firstAction, MotionEvent secondAction, float velocityX,
float velocityY) {
//change the calendar images based on what the user flings. If they fling in between certain
//months, change the background.
Toast.makeText(CalendarDisplay.this, Float.toString(firstAction.getX()) + " : "
+ Float.toString(secondAction.getX()), Toast.LENGTH_SHORT).show();
//right to left fling
if (firstAction.getX() - secondAction.getX() > 120 && Math.abs(velocityX) > 200) {
mainView.setBackgroundDrawable(getResources().getDrawable(R.drawable.spring_bkgr));
month -= 1;
if (month < 0) {
month = 11;
year -= 1;
myCal.set(Calendar.YEAR, year);
myCal.set(Calendar.MONTH, month);
adapter = new CalendarAdapter(CalendarDisplay.this, year, month, currentDay);
calendar.setAdapter(adapter);
currentDate.setText(DateFormat.format(dateTemplate, myCal.getTimeInMillis()));
}
//sets the new month and resets the adapter
myCal.set(Calendar.MONTH, month);
adapter = new CalendarAdapter(CalendarDisplay.this, year, month, currentDay);
calendar.setAdapter(adapter);
currentDate.setText(DateFormat.format(dateTemplate, myCal.getTimeInMillis()));
setBackGrounds();
}
//left to right fling
else if (secondAction.getX() - firstAction.getX() > 120 && Math.abs(velocityX) > 200) {
mainView.setBackgroundDrawable(getResources().getDrawable(R.drawable.summer_bkgr));
month += 1;
if (month > 11) {
month = 0;
year += 1;
myCal.set(Calendar.YEAR, year);
myCal.set(Calendar.MONTH, month);
adapter = new CalendarAdapter(CalendarDisplay.this, year, month, currentDay);
calendar.setAdapter(adapter);
currentDate.setText(DateFormat.format(dateTemplate, myCal.getTimeInMillis()));
}
//probably inefficient but...yeah it works.
myCal.set(Calendar.MONTH, month);
adapter = new CalendarAdapter(CalendarDisplay.this, year, month, currentDay);
calendar.setAdapter(adapter);
currentDate.setText(DateFormat.format(dateTemplate, myCal.getTimeInMillis()));
setBackGrounds();
}
return true;
}
试试这个
private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
page= (TestLayout) findViewById(R.id.mainpage);
page.setOnTouchListener(this);
}
@Override
protected void onPause() {
super.onPause();
onStop();
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
//if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
page.pre();
} else {
page.next();
}
}
//}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
使用您的业务逻辑更改方法page.pre()
和page.post()
希望有帮助。logcat怎么说?onTouch调用上的null指针,然后在onFling中抛出firstAction或secondAction的第一个实例。我想知道这是否与这样一个事实有关,因为它是一个gridView,所以有几个视图被膨胀,每个视图都有自己的手势听众要求???onTouch只调用手势。onTouchEvent(事件);所以NPE的原因很清楚:手势是无效的,而不是。我已经在mainView上测试了它,它可以工作。两个MotionEvents都不能为null,因为您在Toast中使用了它们,对吗?为什么不在onFling中设置断点并逐步调试此方法?很抱歉,这与我的代码没有太大区别:(.谢谢!
private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
page= (TestLayout) findViewById(R.id.mainpage);
page.setOnTouchListener(this);
}
@Override
protected void onPause() {
super.onPause();
onStop();
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
//if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
page.pre();
} else {
page.next();
}
}
//}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}