Android. Как получить значения макета из представлений в TabHost? - PullRequest
1 голос
/ 18 июня 2011

У меня есть хостинг 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;
} 
...