OnClickListener запускается для всех настраиваемых представлений внутри FrameLayout

Я программно добавляю пользовательские представления в 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);
}

Ваши XML-макеты фреймов накладываются друг на друга. В вашем коде все в порядке, покажите нам свой xml.

Amir Dora. 02.05.2018 05:13

Я обновил исходный вопрос, добавив более подробную информацию

pbertsch 02.05.2018 17:19
2
2
214
1

Ответы 1

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

FrameLayout is designed to block out an area on the screen to display a single item. Generally, FrameLayout should be used to hold a single child view, because it can be difficult to organize child views in a way that's scalable to different screen sizes without the children overlapping each other. You can, however, add multiple children to a FrameLayout and control their position within the FrameLayout by assigning gravity to each child, using the android:layout_gravity attribute.

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