У меня есть хостинг TabHost 3 Активности.Помимо вкладок, мне нужна поддержка жестов смахивания для изменения текущей вкладки.Моя проблема заключается в том, что одно из представлений содержит горизонтальную прокрутку, и я не могу понять, как предотвратить касания в горизонтальной прокрутке от изменения текущей вкладки.
plateView - это горизонтальная прокрутка, которая должна обрабатываться.Поиск его дна с помощью plateView.getBottom () и не считая касаний выше, которые работают без TabHost, но теперь он возвращает ноль и вылетает, независимо от того, где он вызывается.
onTouchEvent считает касания повсюду, а dispatchTouchEvent не учитывает касания любого виджета.Кажется, что их комбинация была бы отличной, но вместе они дают ту же функциональность, что и onTouchEvent.Провал в любом месте, чтобы изменить активность.Мое понимание этого немного нечетко.
Почему getBottom () возвращает null?Как я могу заставить это работать?
gestureDetector = new GestureDetector(new CalcGestureDetector());
gestureListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG,"onTOUCH");
if(gestureDetector.onTouchEvent(event)){
return true;
}
return false;
}
};
//Takes the touch and interprets it. Handles it. Changes tabs on fling.
class CalcGestureDetector extends SimpleOnGestureListener{
@Override
public boolean onFling(MotionEvent eOne, MotionEvent eTwo, float velocityX, float velocityY){
Log.d(TAG,"WTF "+plateView.getBottom());
if(false){
}
else{
try{
if (Math.abs(eOne.getY() - eTwo.getY()) > flingMaxOffPath)
return false; //Too much of an arc in the fling.
// right to left swipe
if(eOne.getX() - eTwo.getX() > flingMinDistance && Math.abs(velocityX) > flingMinVelocity) {
tabHost.setAnimation(slideLeftIn);
tabHost.setAnimation(slideLeftOut);
tabHost.setCurrentTab((tabHost.getCurrentTab()+1)%3);
} else if (eTwo.getX() - eOne.getX() > flingMinDistance && Math.abs(velocityX) > flingMinVelocity) {
tabHost.setAnimation(slideRightIn);
tabHost.setAnimation(slideRightOut);
tabHost.setCurrentTab((tabHost.getCurrentTab()+2)%3);
}
}
catch(Exception e){
}
}
return false;
}
}
//This method alone keeps a touch in the weights from changing tabs, but won't register
//touches on ANY widget on any screen (like text views).
public boolean dispatchTouchEvent(MotionEvent event){
super.dispatchTouchEvent(event);
return gestureDetector.onTouchEvent(event);
}
//This method alone counts touches for swipes anywhere and everywhere.
@Override
public boolean onTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event))
return true;
else
return false;
}