2020년 8월 17일 월요일

Drawerlayout drag 영역 변경 하기

DrawerLayout 은 drag 할 수 있는 왼쪽/오른쪽 가장자리 영역이 20dp로 고정되어 있습니다.

이 영역을 변경할 수 있는 api가 공식적으로는 없는데 아래와 같은 방법으로 하면 변경할 수 있습니다.

아래 코드의 edge 의 값을 변경 하면 됩니다.

int edge = 30;


private void setDrawerLayoutMargin() {
    java.lang.reflect.Field leftDragger = null;
    java.lang.reflect.Field rightDragger = null;
    try {
        leftDragger = mDrawerLayout.getClass().getDeclaredField("mLeftDragger");
        rightDragger = mDrawerLayout.getClass().getDeclaredField("mRightDragger");
    } catch (NoSuchFieldException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }

    leftDragger.setAccessible(true);
    rightDragger.setAccessible(true);
    ViewDragHelper leftDraggerObj = null;
    ViewDragHelper rightDraggerObj = null;
    try {
        leftDraggerObj = (ViewDragHelper) leftDragger.get(mDrawerLayout);
        rightDraggerObj = (ViewDragHelper) rightDragger.get(mDrawerLayout);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    java.lang.reflect.Field leftEdgeSize = null;
    java.lang.reflect.Field rightEdgeSize = null;
    try {
        leftEdgeSize = leftDraggerObj.getClass().getDeclaredField("mEdgeSize");
        rightEdgeSize = rightDraggerObj.getClass().getDeclaredField("mEdgeSize");
    } catch (NoSuchFieldException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    leftEdgeSize.setAccessible(true);
    rightEdgeSize.setAccessible(true);
    int edge = 30;
    try {
        leftEdgeSize.setInt(leftDraggerObj, edge * 1);
        rightEdgeSize.setInt(rightDraggerObj, edge * 1);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}