package me.storm.ninegag.view; import android.content.Context; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewCompat; import android.support.v4.widget.DrawerLayout; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; /** * Created by storm on 14-4-19. * * 修复不能自定义DrawerListener的bug */ public class FoldingDrawerLayout extends DrawerLayout { public FoldingDrawerLayout(Context context) { super(context); } public FoldingDrawerLayout(Context context, AttributeSet attrs) { super(context, attrs); } public FoldingDrawerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (isDrawerView2(child)) { System.out.println("at" + i); BaseFoldingLayout foldingNavigationLayout = new BaseFoldingLayout( getContext()); foldingNavigationLayout.setAnchorFactor(1); removeView(child); foldingNavigationLayout.addView(child); ViewGroup.LayoutParams layPar = child.getLayoutParams(); addView(foldingNavigationLayout, i, layPar); } } } public BaseFoldingLayout getFoldingLayout(View drawerView) { if (!isDrawerView2(getRealDrawer(drawerView))) { throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer"); } return isFoldingLayout(getRealDrawer(drawerView)) ? (BaseFoldingLayout) getRealDrawer(drawerView) : null; } boolean isDrawerView2(View child) { final int gravity = ((LayoutParams) child.getLayoutParams()).gravity; final int absGravity = GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(child)); return (absGravity & (Gravity.LEFT | Gravity.RIGHT)) != 0; } /** * Close the specified drawer view by animating it into view. * * @param drawerView Drawer view to close */ public void closeDrawer(View drawerView) { super.closeDrawer(getRealDrawer(drawerView)); } private View getRealDrawer(View drawerView) { View drawerView2 = (View) drawerView.getParent(); if (isFoldingLayout(drawerView2)) { return drawerView2; } else { return drawerView; } } private boolean isFoldingLayout(View drawerView) { return drawerView instanceof BaseFoldingLayout; } }