У меня есть два пользовательских вида (холст), и у обоих есть наблюдатель, который запускает событие на экране и рисует что-то на холсте. Я повторно использую контейнер и отрисовываю холст в том же родительском макете, удаляя другие виды. Прямо сейчас, независимо от того, что мои оба видят ценности наблюдателя.
Я пробовал грязный хак, когда я передаю логическое значение обоим представлениям как истинное, когда одно и другое ложно на коммутаторе, что вроде работает, но я этого не хочу. Потому что это просто взлом. Может кто-нибудь сказать мне android способ сделать это?
public class FakeViewOne extends View {
private EventViewModel eventViewModel;
private float l = 0.0f;
public FakeViewOne(Context context, View ParentView) {
super(context);
eventViewModel = new ViewModelProvider((ViewModelStoreOwner) getContext()).get(EventViewModel.class);
eventViewModel.getTrigger().observe((LifecycleOwner) getContext(), new Observer<Float>() {
@Override
public void onChanged(Float val) {
l = val;
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/*
* if l > 50 change background of a linearlayout
* draw a line on a canvas
* */
invalidate();
}
}
public class FakeViewTwo extends View {
private EventViewModel eventViewModel;
private float l = 0.0f;
public FakeViewTwo(Context context, View ParentView) {
super(context);
eventViewModel = new ViewModelProvider((ViewModelStoreOwner) getContext()).get(EventViewModel.class);
eventViewModel.getTrigger().observe((LifecycleOwner) getContext(), new Observer<Float>() {
@Override
public void onChanged(Float val) {
l = val;
}
});
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/*
* if l > 50 change background of a tile
*
* */
invalidate();
}
}
CODE Внутри фрагмента, где я переключаюсь между этими двумя FakeViews. Как я могу заставить тех, кто не наблюдает значения, когда они не отображаются / неактивны / удалены из представления. Я использую mycanvas.removeAllViews (); .
final RelativeLayout mycanvas = view.findViewById(R.id.myCanvas);
gestureViewModel.getGestureType().observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
assert s != null;
mycanvas.removeAllViews();
switch (s){
case "shake":
ShakeControl(view,myView,mycanvas);
break;
case "move":
MoveControl(view,myView,mycanvas);
break;
}
}
});