demo地址:https://github.com/yugu88/BaoDian
由于在网上找了很久没有可行的解决方案,都是提了一点点就不说了,所以我还是自己跟踪源码研究了一整个晚上,把众多的坑踏平,为了方便以后的人解决沉浸式传了demo。
实现过程有很多的坑,工程源代码已上传github。。。
由于slidingmenu的 jar包和library包 的包名和类名都不同,请在github下载源码slidingmenu,slidingmenu已停止更新,我下载的是最新版本,也可以从我的项目里拷走。。。
代码中有详细的注释……主要是view层级和事件拦截的问题。。slidingmenu包内源码已经优化。
请不要使用网上流传的jar包
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//这里使用的是slidingmenu的第三种用法。
setContentView(R.layout.slidingmenu_main);
View view=getLayoutInflater().inflate(R.layout.main_menu_login, null, false);
// 管理activity
ActivityUtil.getInstance().addActivity(this);
//初始化菜单
initMenu(view);
top=getTitleTop();
}
@Override
protected void onResume() {
super.onResume();
// 判断当前SDK版本号,如果是4.4以上,就是支持沉浸式状态栏的
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
((LinearLayout) findViewById(R.id.sou_s)).setPadding(0, top, 0, 0);
}
}
private int getTitleTop() {
Class<?> c=null;
Object obj=null;
Field field=null;
int x=0, sbar=0;
try {
c=Class.forName("com.android.internal.R$dimen");
obj=c.newInstance();
field=c.getField("status_bar_height");
x=Integer.parseInt(field.get(obj).toString());
sbar=getResources().getDimensionPixelSize(x);// 状态栏高度
} catch (Exception e1) {
e1.printStackTrace();
}
Log.e("状态栏高度:", sbar + ":" + x);
return sbar;
}
private void initMenu(View view) {
mMenu=(SlidingMenu) findViewById(R.id.slidingmenulayout);
mMenu.setMode(SlidingMenu.LEFT);
// 设置触摸屏幕的模式
mMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
//获取屏幕宽高
DisplayMetrics dm=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// 设置滑动菜单视图的宽度
mMenu.setBehindWidth(dm.widthPixels * 4 / 5);
// 设置渐入渐出效果的值
mMenu.setFadeDegree(0.35f);
mMenu.setMenu(view);
initView(view);
}