2013-09-11 3 views
3

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

ответ

5

Вам необходимо создать пользовательские 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; 
} 
4

Я решил проблему с временным решением, не так изящным, но делает работу некоторое время, возможно, содержит побочные эффекты. Я всегда возвращаю 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; 
    } 
} 
+0

Спасибо .. !! Это решает мою проблему :) –

+0

отлично работает. –

Смежные вопросы