OnClickListener срабатывает для всех пользовательских представлений внутри FrameLayout - PullRequest
0 голосов
/ 02 мая 2018

Я добавляю пользовательские виды в FrameLayout программно:

public class CustomView extends View {
 ....
    @Override
    protected void onDraw(Canvas canvas) {
       ... //Doing stuff here 
    }
}

-

containerLayout = (FrameLayout) findViewById(R.id.container_layout);

CustomView cv1 = new CustomView(ctx);
CustomView cv2 = new CustomView(ctx);

cv1.setOnClickListener(new OnClickListener({
 Toast.makeText(ThisActivity.this, "FooBar", Toast.LENGTH_LONG).show();
});

cv2.setOnClickListener(new OnClickListener({
 Toast.makeText(ThisActivity.this, "BlaBlub", Toast.LENGTH_LONG).show();
});

container_layout.addView(cv1);
container_layout.addView(cv2);

Теперь, когда я нажимаю на свой пользовательский вид, событие запускается для обоих пользовательских видов, а не только для того, который я нажал. Я вижу оба тоста один за другим. Есть идеи почему?

ОБНОВЛЕНИЕ 1 - Подробнее Я работаю над приложением AR и пытаюсь интегрировать виды на основе данных о местоположении (GPS), которые работают просто отлично. Единственное, что не работает, это слушатель моего собственного представления. Я вижу свои два пользовательских вида внутри CameraView / SurfaceView, и они не находятся в одинаковом положении

    <FrameLayout
    android:id="@+id/container_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.cameraview.CameraView
        android:id="@+id/camera_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:keepScreenOn="true"
        android:adjustViewBounds="true"
        app:autoFocus="true"
        app:aspectRatio="4:3"
        app:facing="back"
        app:flash="off"/>

    <SurfaceView
        style="@style/ThemeOverlay.AppCompat.Light"
        android:clickable="false"
        android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

Я даже пытался пройти лишнюю милю вот так

 @Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN) {
        if(listener != null) listener.onClick(this);
    }
    return super.dispatchTouchEvent(event);
}

1 Ответ

0 голосов
/ 02 мая 2018

Вы должны заменить FrameLayout на LinearLayout, чтобы два CustomView не имели одинаковую позицию. Ваша проблема возникла из-за того, что CustomView1 и CustomView2 находятся внутри структуры кадра и имеют одинаковую позицию.

FrameLayout предназначен для блокировки области на экране для отображения одного элемента. Как правило, FrameLayout следует использовать для хранения одного дочернего представления, поскольку может быть сложно организовать дочерние представления таким образом, чтобы их можно было масштабировать до разных размеров экрана, не перекрывая друг друга дочерние представления. Однако вы можете добавить несколько дочерних элементов в FrameLayout и управлять их положением в FrameLayout, назначая гравитацию каждому дочернему элементу с помощью атрибута android: layout_gravity.

...