Я программно добавляю пользовательские представления в 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);
}
Я обновил исходный вопрос, добавив более подробную информацию
Вы должны заменить 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.
Ваши XML-макеты фреймов накладываются друг на друга. В вашем коде все в порядке, покажите нам свой xml.