Вопрос:

сделать основной раздел контента активным в DrawerLayout

android navigation-drawer drawerlayout

2466 просмотра

2 ответа

368 Репутация автора

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

Автор: user1831986 Источник Размещён: 11.09.2013 01:51

Ответы (2)


4 плюса

368 Репутация автора

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

public class CustomDrawerLayout extends DrawerLayout {

    public CustomDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // always false and event will be send to each view
        return false;
    }   
}
Автор: user1831986 Размещён: 12.09.2013 05:31

5 плюса

3045 Репутация автора

Решение

Вам нужно создать пользовательские DrawerLayout и @overide onInterceptTouchEvent. Затем вы можете создать какой-то метод регистрации представлений ящика (например setDrawerViewWithoutIntercepting), для которого можно будет использовать (щелкать) основное содержимое, когда оно открыто. Вы должны вызвать этот метод в вашей деятельности / фрагменте, где используется этот DrawerLayout.

OnInterceptTouchEvent будет возвращать false, только если открыт зарегистрированный ящик и касания находятся за пределами области просмотра ящика. Это означает, что все функциональные возможности остаются неизменными (например, закрытие ящика с помощью пролистывания и т. Д.)

Это просто пример, который нужно улучшить, поэтому я надеюсь, что он поможет вам.

private View currentDrawerView;

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean result = super.onInterceptTouchEvent(event);

    if (currentDrawerView != null && isDrawerOpen(currentDrawerView)) {
        DrawerLayout.LayoutParams layoutParams = (DrawerLayout.LayoutParams) currentDrawerView.getLayoutParams();

        if (layoutParams.gravity == Gravity.RIGHT) {
            if (event.getX() < currentDrawerView.getX()) {
                result = false;
            }
        }
        else if (layoutParams.gravity == Gravity.LEFT) {
            if (event.getX() > currentDrawerView.getX() + currentDrawerView.getWidth()) {
                result = false;
            }
        }
        // ......

    };
    return result;
}

public void setDrawerViewWithoutIntercepting(View view) {
    this.currentDrawerView = view;
}
Автор: SocialError Размещён: 12.09.2013 06:39
Вопросы из категории :
32x32