Как заблокировать ящик при щелчке по стороне навигационного ящика, не затрагивая компоновку верхнего и нижнего колонтитула [дубликат]

Короткий ответ: вам нужно выполнить обратный вызов следующим образом:

function callback(response) {
    // Here you can do what ever you want with the response object.
    console.log(response);
}

$.ajax({
    url: "...",
    success: callback
});
3
задан Anton Stukov 20 February 2015 в 11:02
поделиться

3 ответа

На основании другого ответа, который я написал здесь . Я изменил код в соответствии с вашим вопросом.

Подробнее о сенсорной иерархии здесь

dispatchTouchEvent() метод должен быть переопределен в классе Activity

@Override    
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        if (isDrawerOpen()) { //Your code here to check whether drawer is open or not. 

            View content = findViewById(R.id.drawer); //drawer view id
            int[] contentLocation = new int[2];
            content.getLocationOnScreen(contentLocation);
            Rect rect = new Rect(contentLocation[0],
                contentLocation[1],
                contentLocation[0] + content.getWidth(),
                contentLocation[1] + content.getHeight());

            if (!(rect.contains((int) event.getX(), (int) event.getY()))) {
                isOutSideClicked = true;
            } else {
                isOutSideClicked = false;
            }

        } else {
            return super.dispatchTouchEvent(event);
        }
    } else if (event.getAction() == MotionEvent.ACTION_DOWN && isOutSideClicked) {
        isOutSideClicked = false;
        return super.dispatchTouchEvent(event);
    } else if (event.getAction() == MotionEvent.ACTION_MOVE && isOutSideClicked) {
        return super.dispatchTouchEvent(event);
    }

    if (isOutSideClicked) {
        return true; //restrict the touch event here
    }else{
        return super.dispatchTouchEvent(event);
    }
}

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

2
ответ дан Community 27 August 2018 в 08:40
поделиться

очень просто использовать экземпляр ящика, чтобы предотвратить

1. реализовать DrawerLayout.DrawerListener

2. добавьте этот единственный оператор внутри этого метода us

 @Override
public void onDrawerOpened(View drawerView) {
    drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);//DrawerLayout instance
}
0
ответ дан Abdul Rizwan 27 August 2018 в 08:40
поделиться

Упрощенная версия ответа Noundla, который работает для меня. Я написал свой пользовательский Drawer, который расширяет DrawerLayout и реализует метод dispatchTouchEvent().

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (!this.isDrawerOpen(Gravity.LEFT)) {
        return super.dispatchTouchEvent(event);
    }
    boolean isOutSideClicked = false;
    if (event.getAction() == MotionEvent.ACTION_UP) {
        View content = findViewById(R.id.drawer_view); 
        int[] contentLocation = new int[2];
        content.getLocationOnScreen(contentLocation);
        Rect rect = new Rect(contentLocation[0],
                contentLocation[1],
                contentLocation[0] + content.getWidth(),
                contentLocation[1] + content.getHeight());
        isOutSideClicked = !(rect.contains((int) event.getX(), (int) event.getY()));
    }
    this.setDrawerLockMode(isOutSideClicked ? DrawerLayout.LOCK_MODE_LOCKED_OPEN : DrawerLayout.LOCK_MODE_UNLOCKED);
    return super.dispatchTouchEvent(event);
}

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

getChildAt(0).dispatchTouchEvent(event);
2
ответ дан Anton Donov 27 August 2018 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: