动态添加Fragment及侧滑菜单SlidingMenu仿QQ界面
2017-02-09 13:31
218 查看
1.主界面及Fragment界面展示
总的思路是:首先创建主页面布局(头像Imgview+中间页面+底部3个按钮),中间页面的容器是FrameLayout,再创建3个fragment布局及代码,利用FragmentManager和FragmentTransaction实现点击3个按钮会切换fragment。首先创建activity_main_xml布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.soft.qianyu.myqqslidingmenu.MainActivity"> <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:src="@drawable/tx6" /> <FrameLayout android:id="@+id/contanter" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="8"> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <Button android:id="@+id/msg" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:text="消息" /> <Button android:id="@+id/contect" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:text="联系人" /> <Button android:id="@+id/dt" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:text="动态" /> </LinearLayout> </LinearLayout>
头像Imgview+中间页面+底部3个按钮,点击按钮会切换中间的界面
然后创建三个fragment.xml布局和代码部分。
msgfragment.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="消息页面" android:textSize="35sp" android:gravity="center" android:background="#34c13b"/> </LinearLayout>
然后是fragment代码界面
MsgFragment.java
public class MsgFragment extends Fragment { View view; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (view==null){ view = inflater.inflate(R.layout.msg_fragment,container,false); } return view; } }
创建同样的另外两个fragment。
再到MainActivity.java中修改代码
public class MainActivity extends FragmentActivity implements View.OnClickListener{ //声明3个fragment MsgFragment msgFragment; ContectFragment contectFragment; DtFragment dtFragment; //声明FragmentManager碎片管理器和FragmentTransaction碎片转换事务 FragmentManager fragmentManager; FragmentTransaction ft; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化各个碎片及控件并设置监听 init(); } private void init() { //初始化碎片 msgFragment = new MsgFragment(); contectFragment = new ContectFragment(); dtFragment = new DtFragment(); //为底部3个按钮设置监听事件 findViewById(R.id.msg).setOnClickListener(MainActivity.this); findViewById(R.id.contect).setOnClickListener(MainActivity.this); findViewById(R.id.dt).setOnClickListener(MainActivity.this); //获取碎片管理器 fragmentManager = getSupportFragmentManager(); //因为第一次进入程序时会显示消息页面,所以就在这开启一次事务并提交 cb55 ft=fragmentManager.beginTransaction(); ft.replace(R.id.contanter,msgFragment); ft.commit(); } //点击监听事件块 @Override public void onClick(View view) { //开启事务 ft=fragmentManager.beginTransaction(); switch (view.getId()){ case R.id.msg: //转换 ft.replace(R.id.contanter,msgFragment); break; case R.id.contect: //转换 ft.replace(R.id.contanter,contectFragment); break; case R.id.dt: //转换 ft.replace(R.id.contanter,dtFragment); break; } //提交 ft.commit(); } }
以上代码,就可以实现动态添加fragment了。
2.SlidingMenu的侧滑效果的实现
参考网址1参考网址2
注意事项
使用jar包在编译版本大于24时会出现一个问题,会报一个NumberFormat异常,
分析原因 应该是slidingMenu会依赖v4包,但v4包在7.0的时候做了处理,可能把其中一个文件删除了
如果使用jar包则直接将jar包拷贝到相应module的libs目录下并添加lib依赖
如果使用的是github上下载的源码,则在工程目录下导入压缩包中library中的源码,并在相应module下添加module依赖
github上的源码的结构可能会和我们使用的Android studio代码结构不一致,这时为了避免不必要的麻烦
,可以自己新建一个lib module然后把相应的资源,源码拷贝到相应的位置
**1.尽量保持新建libary的包名与原包名一致
2.拷贝源码
3.删除错误注解**
效果图
在上面动态加载Fragment的基础上
首先编写SlidingMenu.xml的布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#4dea62" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="我是slidingmenu" android:textSize="35sp" /> <Button android:id="@+id/back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击返回"/> </LinearLayout>
然后在主MainActivity.java中直接注册并调用方法就可以了
MainActivity.java
public class MainActivity extends FragmentActivity implements View.OnClickListener{ //声明头像按钮和Slidingmenu中的按钮控件 Button back; ImageView img; //声明Slidingmenu SlidingMenu slidingMenu; MsgFragment msgFragment; ContectFragment contectFragment; DtFragment dtFragment; FragmentManager fragmentManager; FragmentTransaction ft; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { msgFragment = new MsgFragment(); contectFragment = new ContectFragment(); dtFragment = new DtFragment(); findViewById(R.id.msg).setOnClickListener(MainActivity.this); findViewById(R.id.contect).setOnClickListener(MainActivity.this); findViewById(R.id.dt).setOnClickListener(MainActivity.this); //为头像按钮设置点击监听事件 findViewById(R.id.img).setOnClickListener(MainActivity.this); fragmentManager = getSupportFragmentManager(); ft=fragmentManager.beginTransaction(); ft.replace(R.id.contanter,msgFragment); ft.commit(); //实例化slidingmenu slidingMenu = new SlidingMenu(MainActivity.this); //设置滑动模式,SlidingMenu.LEFT表示滑动菜单在左边,类似QQ slidingMenu.setMode(SlidingMenu.LEFT); //设置slidingmenu左右滑动的宽度 slidingMenu.setBehindWidth(800); //设置slidingmenu滑动时为上下全屏显示模式 slidingMenu.attachToActivity(MainActivity.this,SlidingMenu.SLIDING_WINDOW); /* 把SlidingMenu附加在Activity上 SlidingMenu.SLIDING_WINDOW:菜单拉开后高度是全屏的 SlidingMenu.SLIDING_CONTENT:菜单拉开后高度是不包含Title/ActionBar的内容区域 */ //设置slidingmenu的侧滑布局 slidingMenu.setMenu(R.layout.slidingmenu_layout); //如果slidingmenu中的控件需要有点击事件则可以按照如下步骤操作 //1.获得slidingmenu的布局view对象 View slidingView = slidingMenu.getMenu(); //2.查找到相应的控件并设置监听器 slidingView.findViewById(R.id.back).setOnClickListener(MainActivity.this); } //执行点击事件 @Override public void onClick(View view) { ft=fragmentManager.beginTransaction(); switch (view.getId()){ case R.id.msg: ft.replace(R.id.contanter,msgFragment); break; case R.id.contect: ft.replace(R.id.contanter,contectFragment); break; case R.id.dt: ft.replace(R.id.contanter,dtFragment); break; case R.id.img: //如果需要在Activity的控件点击事件中展示slidingmenu则调用如下方法 slidingMenu.showMenu(); break; case R.id.back: Toast.makeText(MainActivity.this,"返回成功",Toast.LENGTH_SHORT).show(); //如果需要在Activity的控件点击事件中关闭slidingmenu的展示则调用如下方法 slidingMenu.toggle(); break; } ft.commit(); } }
另外备注:
//如果需要左右两边都有侧滑菜单,则需要进行如下操作 //将slidingmenu的滑动模式设置为左右都有 slidingMen.setMode(SlidingMenu.LEFT_RIGHT); //分别为左右两边的侧滑菜单添加布局 slidingMen.setMenu(R.layout.sliding_layout); //左边的布局 slidingMen.setSecondaryMenu(R.layout.sliding_layout);//右边的布局
相关文章推荐
- VC动态添加菜单类(测试通过)
- Delphi动态添加菜单
- 根据数据库表动态添加菜单及打开窗体
- 动态添加菜单/菜单项、子菜单、右键菜单
- Android中动态添加╱删除的Spinner菜单
- 动态添加菜单
- 用gtk写的动态添加删除菜单、菜单项、子菜单的接口
- Android中动态添加╱删除的Spinner菜单 — ArrayList与Widget的依赖性
- 动态添加菜单
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- 关于asp.net2.0中树型菜单TreeView的动态添加--青蛙非王子(lostfrog)
- 动态添加菜单项、子菜单、右键菜单
- 浅谈如何利用PB实现动态添加菜单(原创)
- 动态添加DevExpress 套件中 dxBar的菜单项目
- 动态添加DevExpressBar中的菜单
- 动态添加/删除Windows资源管理器右键菜单及挂接操作
- VC中动态添加菜单及其命令响应函数
- 动态创建菜单,添加菜单,执行自己的菜单事件
- 浅谈如何利用PB实现动态添加菜单(原创)
- vc动态添加弹出菜单和响应函数