您的位置:首页 > 其它

使用SlidingMenu创建左侧滑动菜单+Fragment的简单用法——学习笔记

2017-10-20 15:38 459 查看
一、导入SlidingMenu库关联库。

首先在github上下载压缩包。
下载地址是:https://github.com/jfeinstein10/SlidingMenu
下载得到SlidingMenu-master.zip文件,解压后进入library文件夹,然后复制它的路径(比如F:\AndroidStudioProjects\Library\SlidingMenu-master\library),将其导入到项目中,步骤是File→New→Import Module,粘贴了路径后把Module name设置成【:SlidingMenu-library】,然后finish。
几乎任何直接导入的库都是会出问题的,所以要把gradle里面一些数字设置的和自己项目gradle的一样,这个SlidingMenu的gradle里面还可以把buildscript{}给注释掉,然后就可以使用了。
不过不要忘了将这个库给自己的项目添加依赖,在Project模式下的App文件上右键,选中Open Module Setting,然后是Dependencies,点右边那个【+】号,选择第三个,Module Dependency,将SlidingMenu库添加。如果忘记添加依赖,那就白导入库了。
最后最后,运行了还是会报错。
Error:(303, 27) 错误: 找不到符号
符号:   方法 sin(float)
位置: 类 FloatMath
这时候进入FloatMath类,会发现sin(float)方法其实就是:
return (float) Math.sin(angle);
所以把FloatMath.sin(f)改为Math.sin(f)即可。
(虽然这些过程我已经非常熟悉,还是要写一下,享受拍打键盘和挥霍时间的快感)


二、粗略的操作步骤

将MainActivity继承的AppCompatActivity改为SlidingFragmentActivity,然后把onCreate的修饰由protect改成public,之后就是如何写代码了。
1.配置主页面
setContentView(R.layout.activity_main);
2.配置左侧菜单布局
setBehindContentView(R.layout.activity_left);
3.配置菜单使用模式:左侧可用
SlidingMenu slidingMenu = getSlidingMenu();
slidingMenu.setMode(SlidingMenu.LEFT);
4.设置拖拽区域:整个屏幕
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
5.配置主页面留着屏幕的宽度:200像素
slidingMenu.setBehindOffset(200);
如果想添加一个右菜单的话,可以在第3步后面加上代码
slidingMenu.setSecondaryMenu(R.layout.activity_rightmenu);
不过一般很少看见这种设计。


以下是代码——

MainActivity:

public class MainActivity extends SlidingFragmentActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initSlidingMenu();

}

private void initSlidingMenu(){
setContentView(R.layout.activity_main); //1.设置主页面
setBehindContentView(R.layout.activity_leftmenu); //2.设置左侧菜单
SlidingMenu slidingMenu = getSlidingMenu(); //3.配置菜单
slidingMenu.setMode(SlidingMenu.LEFT); //4.设置菜单显示模式为左侧可用
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//5.设置滑动模式为全屏滑动
slidingMenu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);//同时给左菜单添加滑动,如果不添加的话你会发现滑开左侧菜单后,不能从菜单滑回主页面
slidingMenu.setBehindOffset(DensityUtils.dip2px(MainActivity.this, 100));//6.设置主页占据的宽度
}
}


左菜单布局:R.layout.activity_leftmenu

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/left_menu"
android:background="@android:color/holo_blue_light"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:text="我就是左侧菜单!!"
android:textSize="30sp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</FrameLayout>


主页面布局:R.layout.activity_main

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_content_fl"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:text="主页面"
android:textSize="30sp"
android:textColor="@android:color/holo_blue_light"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</FrameLayout>


效果图



接下来说一下Fragment的简单用法(懒得再写一篇啦!!!而且讲Fragment还需要用刀一点上面的东西来做对比)

如果要把主页面和左侧菜单的布局替换成Fragment,那么首先就需要创建左菜单fragment和主页面fragment,由于每次创建fragment都要重写由于每次创建Fragment老是要去重写onCreate(),onCreateView(),onActivityCreated()等方法,所以干脆创建一个基类,在基类里面重写这些方法,然后让需要重写这些方法的Fragment都来继承这个基类,这样就省去一些麻烦。


接下来写一个Fragment的基类——BaseFragment:

public abstract class BaseFragment extends Fragment {
public Context context;
//    public Activity context;

//当Fragment被创建时候调用这个方法
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getActivity();
//        context = getActivity();
}

//当视图被创建的时候回调
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return initView();
}

//当Activity被创建之后被回调
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData();
}

//让child实现自己的视图,达到child自己特有的效果,这个是强制child去实现的
public abstract View initView();

/**
* 1.如果子页面没有数据,联网请求数据,并绑定到initView初始化的视图上
* 2.如果有数据,就直接绑定
*/
public void initData(){}
}


基类创建好后,来创建左菜单Fragment以及主页面Fragment

左菜单Fragment——LeftMenuFragment:

public class LeftMenuFragment extends BaseFragment {
private TextView textView;

@Override
public View initView() {
textView = new TextView(context);
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
LogUtil.e("左侧菜单页面被初始化");
return textView;
}

@Override
public void initData() {
super.initData();
textView.setText("吾乃常山赵子龙!");
Log.e("左侧数据被初始化");
}
}


主页面Fragment——ContentFragment:

public class ContentMenuFragment extends BaseFragment {

private TextView textView;

@Override
public View initView() {
textView = new TextView(context);
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
LogUtil.e("主页面被初始化");
return textView;
}

@Override
public void initData() {
super.initData();
textView.setText("卧龙凤雏,得一而安天下!");
Log.e("主页面数据被初始化");
}
}


当然了,上面写在initData的setText方法可以写在initView中,之所以写在initData中是为了形成一种数据和视图分离的思维,有一点扯淡,就是见仁见智的事情吧,也不太好说明。

这两个Fragment写完之后,在MainActivity里面替换即可,接下来初始化Fragment并且替换布局,

在MainActivity中写一个方法:

private void initFragment(){
FragmentManager fm = getSupportFragmentManager(); //获取manager
FragmentTransaction ft = fm.beginTransaction(); //开启事务
ft.replace(R.id.main_content_fl, new ContentMenuFragment(), CONTENT_MENU_TAG); //替换主页面,第三个设置的Tag参数用于找到这个Fragment
ft.replace(R.id.left_menu, new LeftMenuFragment(), LEFT_MENU_TAG); //替换左侧菜单
ft.commit();//提交
}


把上面这个方法添加到onCreat中即可,注意最后的commit()千万别忘了,我就是忘记写这个,然后页面一直是原来的内容,我找了好久问题所在!!!

以下是运行结果



可以发现,Fragment并没有真正的替换掉原布局中的TextView,只是覆盖在上面了,只要把原布局中的TextView相关代码删除或者注释掉即可。以下是删除后的运行结果:



然后下面是MainActiviy的最终代码:

public class MainActivity extends SlidingFragmentActivity{

private static final String CONTENT_MENU_TAG = "content_menu_tag";
private static final String LEFT_MENU_TAG = "left_menu_tag";

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
AlertDialog.Builder build = new AlertDialog.Builder(this);
build.setTitle("注意")
.setMessage("确定要退出吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
break;
default:
break;
}
return false;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initSlidingMenu();
initFragment();
}

private void initSlidingMenu(){
setContentView(R.
9801
layout.activity_main); //1.设置主页面
setBehindContentView(R.layout.activity_leftmenu); //2.设置左侧菜单
SlidingMenu slidingMenu = getSlidingMenu(); //3.配置菜单
slidingMenu.setMode(SlidingMenu.LEFT); //4.设置菜单显示模式为左侧可用
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//5.设置滑动模式为全屏滑动
slidingMenu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);//同时给左菜单添加滑动
slidingMenu.setBehindOffset(DensityUtils.dip2px(MainActivity.this, 100));//6.设置主页占据的宽度
}

private void initFragment(){
FragmentManager fm = getSupportFragmentManager(); //获取manager
FragmentTransaction ft = fm.beginTransaction(); //开启事务
ft.replace(R.id.main_content_fl, new ContentMenuFragment(), CONTENT_MENU_TAG); //替换主页面,第三个设置的Tag参数用于找到这个Fragment
ft.replace(R.id.left_menu, new LeftMenuFragment(), LEFT_MENU_TAG); //替换左侧菜单
ft.commit();//不能忘不能忘不能忘!!!!
}
}


多了一个重写的onKeyDown()方法,这个方法用来设置点击返回键是否退出程序。

下面是运行图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: