onTouch() не вызывается для родительского макета

У меня есть такой макет:

LinearLayout
    RelativeLayout(id = test)
        FrameLayout (From a LIB. id = lib)

Я пытался добавить onTouchListener() в test но это не работает

Я старался:

@OnTouch(R.id.test)
public boolean test(View v,MotionEvent e) { NOT WORK }

И я попробовал простой слушатель:

    test.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
NOT WORK
                    return false;
                }
            });

Я пытался добавить слушателей FrameLayout но тоже не работает.

Я не хочу изменять библиотеку. Кто-нибудь есть идея использовать OnTouch событие?

<RelativeLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/black"
    android:layout_weight="1">

        <com.flurgle.camerakit.CameraView
            android:id="@+id/camera"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center_horizontal"
            android:adjustViewBounds="true"
            app:ckCropOutput="false"
            app:ckFacing="back"
            app:ckFlash="off"
            app:ckFocus="continuous"
            app:ckJpegQuality="100"
            app:ckMethod="standard"/>

    <TextView

В CameraView:

focusMarkerLayout.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent motionEvent) {
            int action = motionEvent.getAction();
            if (motionEvent.getAction() == MotionEvent.ACTION_UP && mFocus == CameraKit.Constants.FOCUS_TAP_WITH_MARKER) {
                focusMarkerLayout.focus(motionEvent.getX(), motionEvent.getY());
            }

            mPreviewImpl.getView().dispatchTouchEvent(motionEvent);
            return true;
        }
    });

Благодарю.


Решение:


LinearLayout
    RelativeLayout(id = test)
        CustomRelativeLayout()
            FrameLayout (From a LIB. id = lib)

Создать CustomRelativeLayout

public class CustomRelativeLayout extends RelativeLayout{
    public CustomRelativeLayout(Context context) {
        super(context);
    }

    public CustomRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return false;
    }
}

Проблема:

Touch 
-> Activity:dispatchTouchEvent 
-> LinearLayout:dispatchTouchEvent 
-> CustomRelativeLayout:dispatchTouchEvent 
-> CameraView:dispatchTouchEvent (return true) STOPPED everything

Решение:

Touch 
-> Activity:dispatchTouchEvent 
-> LinearLayout:dispatchTouchEvent 
-> CustomRelativeLayout:dispatchTouchEvent 
-> CustomRelativeLayout:onTouch
-> LinearLayout:onTouch
-> Activity:onTouch (IT WORK :))

2 ответа

Решение

Наиболее вероятно FrameLayout потребляет сенсорное событие. Как только событие касания используется любым представлением, это событие не будет отправлено родителю. Если FrameLayout к нему прикреплен прослушиватель кликов, затем MotionEvent не достигнет RelativeLayout,

Вы можете подкласс RelativeLayout переопределить ViewGroup#dispatchTouchEvent(MotionEvent) и отслеживать MotionEvent который будет отправлен детям этого макета (в вашем случае FrameLayout).

В этом случае ваша иерархия представлений будет такой:

<LinearLayout>
    <com.example.CustomRelativeLayout>
        <FrameLayout>
    </com.example.CustomRelativeLayout>
</LinearLayout>

Я думаю, что ваш RelativeLayout переопределяется FrameLyout, поэтому сенсорный не работает. Разместите свой макет XML-кода

Другие вопросы по тегам