Имитация события касания в диалоговых / раскрывающихся окнах, которые отображаются при нажатии кнопки в Android - PullRequest
0 голосов
/ 07 августа 2020

У меня есть действие, в котором я показываю DatePickerDialog в событии нажатия кнопки, например:

Я моделирую события касания в элементах действия, используя методы MotionEvent и dispatchTouchEvent на основе координат (x, y) , который я получаю от своего бэкэнда. Это отлично работает во всех случаях, за исключением случаев, когда макет всплывающего типа показан как dropdown или dialog.

В основном мой метод simulateClick не работает при изменении windowFocus!

Мой вопрос:

В настоящее время события касания происходят на элементах под диалоговым окном (т.е. только на уровне активности). Это похоже на наличие элемента z-index на экране, и события происходят на z-index:0, тогда как я хочу, чтобы они происходили на более высоком z-index, то есть на плавающих представлениях / макетах и ​​т. д. c. Как это реализовать?

Код выбора даты активности

dateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Get Current Date
                final Calendar c = Calendar.getInstance();
                mYear = c.get(Calendar.YEAR);
                mMonth = c.get(Calendar.MONTH);
                mDay = c.get(Calendar.DAY_OF_MONTH);


                DatePickerDialog datePickerDialog = new DatePickerDialog(HomeLoanActivity.this,
                        new DatePickerDialog.OnDateSetListener() {

                            @Override
                            public void onDateSet(DatePicker view, int year,
                                                  int monthOfYear, int dayOfMonth) {

                                Log.d("DATE", "onDateSet: "+(dayOfMonth + "-" + (monthOfYear + 1) + "-" + year));

                            }
                        }, mYear, mMonth, mDay);

                datePickerDialog.show();
            }
        });

Код клика для имитации активности

private void simulateClick(float x, float y) {
        long downTime = SystemClock.uptimeMillis();
        long eventTime = SystemClock.uptimeMillis();
        MotionEvent motionEvent = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y, -1);
        dispatchTouchEvent(motionEvent);//touch the finger
        motionEvent.setAction(MotionEvent.ACTION_UP);
        dispatchTouchEvent(motionEvent);//lift the finger
        Log.d(TAG, "simulateClick: complete");

    }
...