Подтвердить что ты не робот

Слушайте первый TouchEvent при использовании SYSTEM_UI_FLAG_HIDE_NAVIGATION

Начиная с API 14 вы можете использовать этот флаг SYSTEM_UI_FLAG_HIDE_NAVIGATION в представлении в своей деятельности, чтобы сообщить системе, с которой вы хотите скрыть панель навигации, до тех пор, пока не появится взаимодействие с пользователем (сенсорный экран). Как только пользователь нажимает на экран, отображается полоса.

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

После добавления этого флага система перехватывает первое касание экрана и реагирует на него, показывая навигационную панель. Это не до второго прикосновения, что любой из моих представлений или моя активность получают TouchEvents.

Кто-нибудь знает, как я могу настроить слушателя, который позволит мне запустить мое второе действие при первом касании экрана, а не при необходимости использовать двойной флажок при использовании этого скрытого флага?

Я пробовал все следующие, и я не получаю обратные вызовы никому из них, когда экран коснулся в первый раз, чтобы показать панель навигации.

@Override
public void onUserInteraction(){
    Log.i(myTag, "INTERACT");
}

@Override
public boolean onGenericMotionEvent(MotionEvent me){
    Log.i(myTag, "GENERIC");

    return true;
}

//I thought maybe the size change would lead to a callback here. No dice though.
@Override 
public void onWindowAttributesChanged(WindowManager.LayoutParams params){
    Log.i(myTag, "WINDOW CHANGE");
}
@Override
public boolean dispatchTouchEvent(MotionEvent me){
    Log.i(myTag, "TOUCH");
    return true;
}

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

4b9b3361

Ответ 1

Как сказал Джош Ли в своем комментарии, ключом был View.OnSystemUiVisibilityChangeListener.

Вот код, который я использовал:

mView.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int vis) {
        Log.i(myTag, "System UI"+ vis);
        if(vis == 0){
            Intent i = new Intent(MainActivity.this, AnotherActivity.class);
            startActivity(i);
            finish();
        }
    }
});

Я думаю, что mView может быть ссылкой на любое представление, которое в настоящее время отображается в вашей Деятельности. В моем случае это был полноэкранный VideoView и был единственным видом в моем макете.