抽屉效果就是DrawerLayout,该类位于V4包中。
android.support.v4.widget.DrawerLayout,与SlideMenu效果类似,但界面效果有些不同(不细说)
在使用DrawerLayout的过程中,最常用的是左右抽屉内容固定,直接写在xml中,
比如:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 内容区域 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
</RelativeLayout>
<!-- 左侧抽屉 -->
<LinearLayout
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:background="#E0EEE0"
android:orientation="vertical" >
</LinearLayout>
<!-- 右侧抽屉 -->
<LinearLayout
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="right"
android:background="#EE8262"
android:orientation="vertical" >
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 内容区域 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
</RelativeLayout>
<!-- 左侧抽屉 -->
<LinearLayout
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:background="#E0EEE0"
android:orientation="vertical" >
</LinearLayout>
<!-- 右侧抽屉 -->
<LinearLayout
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="right"
android:background="#EE8262"
android:orientation="vertical" >
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
这类最简单的是官方类的。但我们要用的时候会有很多变化,比如,左右或者还有中间部分内容不固定,就需要使用Fragmemnt,可以使用fragment的replaceFRagment方法替换:
private Fragment replaceFragment(int viewResource, String fragmentName, String key, int extraValue) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = Fragment.instantiate(this, fragmentName);
Bundle args = new Bundle();
args.putInt(key, extraValue);
fragment.setArguments(args);
ft.replace(viewResource, fragment);
ft.commit();
getSupportFragmentManager().executePendingTransactions();
return fragment;
}
或者
private Fragment replaceFragmentByName(int viewResource, String fragmentName) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = Fragment.instantiate(this, fragmentName);
ft.replace(viewResource, fragment);
ft.commit();
getSupportFragmentManager().executePendingTransactions();
return fragment;
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = Fragment.instantiate(this, fragmentName);
Bundle args = new Bundle();
args.putInt(key, extraValue);
fragment.setArguments(args);
ft.replace(viewResource, fragment);
ft.commit();
getSupportFragmentManager().executePendingTransactions();
return fragment;
}
或者
private Fragment replaceFragmentByName(int viewResource, String fragmentName) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = Fragment.instantiate(this, fragmentName);
ft.replace(viewResource, fragment);
ft.commit();
getSupportFragmentManager().executePendingTransactions();
return fragment;
}
这是一个方法,只是有的fragment需要不同标记或传递参数等,可根据自己的需要自己写这个replace方法。
DrawableLayout 几个重要方法:
private DrawerLayout mDrawerLayout;
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerLayout.setDrawerShadow(R.drawable.drawablelayout_left_shadow, Gravity.START); //左侧抽屉设置阴影,这个阴影最好比较小,有一点效果就好了,不能切图,会很难看,最好自己写渐变的shape,定好宽高
mDrawerLayout.setDrawerShadow(R.drawable.drawablelayout_right_shadow, Gravity.END);
mDrawerLayout.setScrimColor(getResources().getColor(R.color.c_03222d)); //抽屉效果显现出来时有透明渐变到此颜色
mDrawerLayout
.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, findViewById(R.id.fragment_content_right)); //锁定右侧抽屉不能滑动出现,但这种情况点击返回时,抽屉不会退出,需要下面监听改变 DrawerLockMode:
mDrawerLayout.setDrawerListener(new DrawerListener() {
@Override
public void onDrawerStateChanged(int arg0) {
}
@Override
public void onDrawerSlide(View arg0, float arg1) {
}
@Override
public void onDrawerOpened(View arg0) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,
findViewById(R.id.fragment_content_right));
}
@Override
public void onDrawerClosed(View arg0) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
findViewById(R.id.fragment_content_right));
}
});
mDrawerLayout.setDrawerShadow(R.drawable.drawablelayout_right_shadow, Gravity.END);
mDrawerLayout.setScrimColor(getResources().getColor(R.color.c_03222d)); //抽屉效果显现出来时有透明渐变到此颜色
mDrawerLayout
.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, findViewById(R.id.fragment_content_right)); //锁定右侧抽屉不能滑动出现,但这种情况点击返回时,抽屉不会退出,需要下面监听改变 DrawerLockMode:
mDrawerLayout.setDrawerListener(new DrawerListener() {
@Override
public void onDrawerStateChanged(int arg0) {
}
@Override
public void onDrawerSlide(View arg0, float arg1) {
}
@Override
public void onDrawerOpened(View arg0) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,
findViewById(R.id.fragment_content_right));
}
@Override
public void onDrawerClosed(View arg0) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
findViewById(R.id.fragment_content_right));
}
});
另外,如果想不根据系统自带的抽屉效果宽,可以在
DrawerLayout的xml中设定宽度,比如最上方的240dp,200dp,而不是在replace的fragment中设置,我也没有在fragment的xml中试过,有机会看看是不是一样的效果