Проблемы MotionEvent Action_Up при прохождении события

У меня есть вид сверху (прозрачный) на мое приложение.
это должно поймать длинное нажатие на 5 секунд и открыть меню. Итак, я реализовал OnTouchListener. так :

public boolean onTouch(View v, MotionEvent event)
                {       
                        long downtime = 0;
                        long eventt = 0;


                        boolean returnvalue = false; 

                        switch (event.getAction() & MotionEvent.ACTION_MASK) 
                        {

                        case MotionEvent.ACTION_DOWN:
                             eventt = event.getEventTime();                         
                             returnvalue = true; 
                             break;

                        case MotionEvent.ACTION_UP:

                            downtime = event.getDownTime();
                            if (eventt - downtime > 5000)
                            {
                                Main.changePlayerDialog.show();
                                returnvalue = true;
                            }
                            else
                            { 
                                returnvalue = false;
                                //return false;
                            }
                            break;

                        default: 
                                break;
                       }                

                        return returnvalue;

                    }
                });

теперь для 5-секундного касания и отпускания это работает просто отлично. однако, когда его меньше 5, я возвращаю false. Однако MotionEvent не передается другим представлениям под ним! поэтому все кнопки и т. д. базовых представлений теперь «отключены» ...

Если я сразу возвращаю false, все работает нормально... но тогда ACTION_UP больше не срабатывает, если сработала базовая кнопка. (кажется логичным, событие было обработано где-то еще).

Как я могу это исправить ?


person ron    schedule 15.02.2012    source источник


Ответы (1)


Вы пытались вернуть:

return super.onTouch(v, event);

?

--- Редактировать

Ну а если так:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
     >

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="coucou"
        android:id="@+id/button" />


    <LinearLayout  android:id="@+id/linear"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
         />

</RelativeLayout>

И добавьте onTouch в линейную компоновку и нажмите кнопку, кнопка никогда не поймает событие...

person Cehm    schedule 15.02.2012
comment
Я получаю StackOverFlowError в android.view.MotionEvent.getEventTime(MotionEvent.java:1389) - person ron; 15.02.2012
comment
Ну, проблема в том, что вы не можете коснуться представления, которое находится под другим представлением... проверьте мое отредактированное сообщение... - person Cehm; 15.02.2012
comment
на самом деле, вы можете. Если вы передадите false верхнему, он будет передан вниз. Как я уже сказал, все работает нормально, если я сразу возвращаю false. - person ron; 15.02.2012
comment
Хорошо, но это потому, что у вашего ребенка есть что-то вроде дубликатаParentState ? - person Cehm; 15.02.2012
comment
ничего подобного на самом деле. так же, как, например, список с кнопками. Базовая сборка. ДАЖЕ, если я просто добавлю пустой вид сверху, он все равно пройдет через мои события. - person ron; 15.02.2012