Прерывание события последнего касания в Android - PullRequest
1 голос
/ 29 мая 2020

Мое приложение показывает ListPopupWindow как контекстное меню, когда пользователь долго нажимает на элемент списка. После отображения контекстного меню фон по-прежнему доступен для перетаскивания, пока пользователь не поднимет палец. Вы можете увидеть поведение в прикрепленных гифках. Я хочу знать, как прервать это перетаскивание.

TrackListAdapter. java:

private final float[] longClickLastTouchDownXY = new float[2];

@Override
@CallSuper
public void onBindViewHolder(VH holder, int position) {
    holder.itemView.setOnTouchListener((v, event) -> {
        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
            longClickLastTouchDownXY[0] = event.getX();
            longClickLastTouchDownXY[1] = event.getY();
        }
        return false;
    });
    holder.itemView.setOnLongClickListener(v -> {
        if (onItemLongClickListener != null) {
            onItemLongClickListener.onItemLongClick((ViewGroup) v,
                    (int) longClickLastTouchDownXY[0], (int) longClickLastTouchDownXY[1],
                    holder.getAdapterPosition());
            return true;
        }
        return false;
    });
}

TrackListFragment. java:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View layout = inflater.inflate(R.layout.list_track, container, false);
    ButterKnife.bind(this, layout);


    tracksList.setAdapter(tracksAdapter);
    tracksAdapter.setOnItemLongClickListener(this::showTrackContextMenu);

    return layout;
}

private void showTrackContextMenu(ViewGroup rootView, float x, float y, int itemPosition) {
    Track selectedTrack = tracksAdapter.get(itemPosition);
    ListPopupWindow popupWindow = new ListPopupWindow(requireContext());
    ListPopupWindowAdapter adapter = new ListPopupWindowAdapter(requireContext(), R.menu.track_menu);
    popupWindow.setAdapter(adapter);

    View tempView = new View(requireContext());
    ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(0, 0);
    tempView.setLayoutParams(lp);
    tempView.setX(x - rootView.getPaddingLeft());
    tempView.setY(y - rootView.getPaddingTop());
    rootView.addView(tempView);

    popupWindow.setAnchorView(tempView);
    popupWindow.setModal(true);
    popupWindow.setOnDismissListener(() -> rootView.removeView(tempView));
    popupWindow.show();
}

image image2

1 Ответ

1 голос
/ 29 мая 2020

Это должно работать в теории, я не тестировал это:

Для замораживания вертикальной прокрутки RecyclerView:

RecyclerView имеет метод с именем setLayoutFrozen(boolean frozen);, этот метод, кажется, блокирует TouchEvent RecyclerView, пока он активен (когда вы устанавливаете frozen в значение true).

Теперь я предполагаю, что ваш метод showTrackContextMenu(.....) вызывается, когда вы долго нажимаете элемент в своем списке (кажется, вы создали для этого интерфейс). В любом случае попробуйте заморозить RecyclerView в конце этого метода. Примерно так:

private void showTrackContextMenu(ViewGroup rootView, float x, float y, int itemPosition) {

.......
.......
.......

popupWindow.show();

//here
yourRecyclerView.setLayoutFrozen(true);

}

Если вы хотите убрать замораживание, чтобы можно было прокрутить снова, просто вызовите это:

yourRecyclerView.setLayoutFrozen(false);

Для замораживания ViewPager:

Хорошо, я не могу найти метод, созданный для замораживания ViewPager, единственное, что вы действительно можете сделать, - это создать собственный ViewPager, использовать его вместо этого и заставить его делать то, что вы хотите:

class MyViewPager extends ViewPager{

private boolean frozen = false;

public MyViewPager(Context context){
super(context);
}

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

public void freezeViewPager(boolean frozen){
this.frozen = frozen;
}

@Override
 public boolean onTouchEvent(MotionEvent event) {
if(frozen){
 return false;
}else{
 return super.onTouchEvent(event);
}

}

}

Затем вы используете указанный выше ViewPager в xml вместо используемого по умолчанию.

Чтобы заморозить его:

.......

popupWindow.show();

//here freeze recyclerView
yourRecyclerView.setLayoutFrozen(true);
//here freeze view pager
myViewPager.freezeViewPager(true);

Чтобы остановить замораживание:

myViewPager.freezeViewPager(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...