无需SherlockActionbar的SlidingMenu使用详解(二)——向Fragment中添加ViewPager和Tab
之前我们对大体框架有了一定的认识,现在我们来做Fragment界面,其实这里面和这个框架的关系就不大了,但因为有些同学对于在SlidingMenu中切换fragment还是有问题,所以我就在本篇进行详细讲解。
1.定义MenuFragment
1.1首先定义这个fragment的布局文件,其实很简单了就是几张图片和一个listview
app_menu.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="200dp" android:layout_height="match_parent"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="120dp" ><ImageViewandroid:id="@+id/backgroundPicture_id"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitXY"android:src="@drawable/background" /><ImageViewandroid:id="@+id/head_pic_id"android:layout_width="60dp"android:layout_height="60dp"android:layout_alignParentLeft="true"android:layout_marginLeft="22dp"android:layout_marginTop="40dp"android:scaleType="fitXY"android:src="@drawable/kale" /><TextViewandroid:id="@+id/name_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignBottom="@+id/head_pic_id"android:layout_marginBottom="20dp"android:layout_marginLeft="20dp"android:layout_marginTop="55dp"android:layout_toRightOf="@id/head_pic_id"android:text="JackTony"android:textColor="#ffffff"android:textSize="20sp" /></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="90dp"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:gravity="center"android:orientation="horizontal" ><ImageViewandroid:id="@+id/personalSetting_id"android:layout_width="90dp"android:layout_height="90dp"android:layout_marginRight="10dp"android:src="@drawable/personalsettingbutton"android:scaleType="fitCenter" /><ImageViewandroid:id="@+id/releaseMessageButton_id"android:layout_width="90dp"android:layout_height="90dp"android:layout_marginLeft="10dp"android:src="@drawable/releasemessagebutton"android:scaleType="fitCenter" /></LinearLayout><RelativeLayout android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/menu_list"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="15dp" /></RelativeLayout></LinearLayout>
1.2和往常一样,我们在Fragment中加载布局文件,并且给里面的listview添加适配器用于绑定数据
MenuFragment
package com.kale.slidingmenutest.fragment;import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView;import com.kale.slidingmenutest.MainActivity; import com.kale.slidingmenutest.R;/*** @author:JackTony* @tips :菜单的fragment* @date :2013-11-17*/ public class MenuFragment extends Fragment {private MainActivity activity;@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);this.activity = (MainActivity)activity;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){View v = inflater.inflate(R.layout.app_menu, null);return v;}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);String []items = {"第一个栏目","第二个栏目"};ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,items);ListView menuLv = (ListView)getActivity().findViewById(R.id.menu_list);//设置适配器和监听器 menuLv.setAdapter(adapter);menuLv.setOnItemClickListener(new MenuItemClickListener());}class MenuItemClickListener implements OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {Fragment newFragment = null; MainActivity.NOW_FRAGMENT_NO = position;activity.supportInvalidateOptionsMenu();switch (position) {case 0:newFragment = new FirstFragment();break;case 1:newFragment = new SecondFragment();break;}if (newFragment != null) {//交给Activity来切换正文fragment activity.switchContent(newFragment);}}}}
讲解:
1.listview用一个最简单的ArrayAdapter来放了两个数据,并且添加了监听器来监听点击事件。
2.在实际使用中不同的fragment很可能会需要不同的菜单,所以我通过对MainActivity中静态变量的设置和activity.supportInvalidateOptionsMenu();来使得每次切换Fragment的时候都重新根据静态变量的值来生成菜单项
3.这里面因为要用到MainActivity中切换Fragment的方法,所以要生成MainActivity对象。需要注意的是在多次切换后这个Fragment中的getActivity()方法很可能会出错,返回null值。因此这里在绑定activity时实例化一个activity对象是很有必要的!
2.简单的Fragment
SecondFragment是个很简单的Fragment,就是为了举例子用的。
package com.kale.slidingmenutest.fragment;import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;public class SecondFragment extends MenuFragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {TextView textView = new TextView(getActivity());textView.setGravity(Gravity.CENTER);textView.setText("第二个Fragment");textView.setTextSize(30);return textView;} }
3.拥有TAB和ViewPager的FirstFragment
先贴上布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="visible" /></LinearLayout>
这里面稍微有个难点就是,在不同的页面滑动时要实时改变slidingMenu的触控范围,是边缘还是全屏触控都需要设置。
3.1初始化viewPager和actionbar,并添加监听器。
因为actionbar监听器中需要传入viewpager做判断,所以要先初始化viewpager。
ViewPager viewPager;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO 自动生成的方法存根return inflater.inflate(R.layout.first_fragment, null);}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {// TODO 自动生成的方法存根super.onActivityCreated(savedInstanceState);//设置actionbar initViewPager();initActionBar();}/***/private void initActionBar() {ActionBar actionBar = ((MainActivity)getActivity()).getSupportActionBar();//设定有Tab actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);ActionBar.Tab tab;//开始添加Tab,这里添加4个,并且设置监听器for (int i = 1; i <= 4; i++) {tab = actionBar.newTab();tab.setText("Tab " + i);tab.setTabListener(new MyTabListener(viewPager));actionBar.addTab(tab);}}private void initViewPager() {ArrayList<View> list = new ArrayList<View>();for (int i = 0; i < 4; i++) {list.add(newTextView("第"+(i+1)+"个界面"));}viewPager = (ViewPager)getActivity().findViewById(R.id.viewPager);viewPager.setAdapter(new MyPagerAdapter(list));viewPager.setOnPageChangeListener(new PageChangeListener((MainActivity)getActivity()));}private TextView newTextView(String text) {TextView tv = new TextView(getActivity());tv.setText(text);tv.setTextSize(30);tv.setGravity(Gravity.CENTER);return tv;}
/*** @author:Jack Tony 这里配置适配器* @tips :这里传入一个list数组,从每个list中可以剥离一个view并显示出来* @date :2014-9-24*/public class MyPagerAdapter extends PagerAdapter {private ArrayList<View> mViewList;private int pagerNum = 0;public MyPagerAdapter(ArrayList<View> viewList) {mViewList = viewList;}public int getPagerNum() {return pagerNum;}@Overridepublic int getCount() {return mViewList.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {if (mViewList.get(arg1) != null) {((ViewPager) arg0).removeView(mViewList.get(arg1));}}@Overridepublic Object instantiateItem(View arg0, int arg1) {try {if (mViewList.get(arg1).getParent() == null) {((ViewPager) arg0).addView(mViewList.get(arg1), 0);} else {/** 很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,* 所以得解绑不这样做否则会产生 viewpager java.lang.IllegalStateException:* The specified child already has a parent. You must call* removeView() on the child's parent first.*/((ViewGroup) mViewList.get(arg1).getParent()).removeView(mViewList.get(arg1));((ViewPager) arg0).addView(mViewList.get(arg1), 0);}} catch (Exception e) {e.printStackTrace();} finally {pagerNum = arg1;}return mViewList.get(arg1);}}
全部代码:
package com.kale.slidingmenutest.fragment;import java.util.ArrayList;import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;import com.kale.slidingmenutest.MainActivity; import com.kale.slidingmenutest.R; import com.kale.slidingmenutest.listener.MyTabListener; import com.kale.slidingmenutest.listener.PageChangeListener;public class FirstFragment extends Fragment {ViewPager viewPager;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO 自动生成的方法存根return inflater.inflate(R.layout.first_fragment, null);}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {// TODO 自动生成的方法存根super.onActivityCreated(savedInstanceState);//设置actionbar initViewPager();initActionBar();}/***/private void initActionBar() {ActionBar actionBar = ((MainActivity)getActivity()).getSupportActionBar();//设定有Tab actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);ActionBar.Tab tab;//开始添加Tab,这里添加4个,并且设置监听器for (int i = 1; i <= 4; i++) {tab = actionBar.newTab();tab.setText("Tab " + i);tab.setTabListener(new MyTabListener(viewPager));actionBar.addTab(tab);}}private void initViewPager() {ArrayList<View> list = new ArrayList<View>();for (int i = 0; i < 4; i++) {list.add(newTextView("第"+(i+1)+"个界面"));}viewPager = (ViewPager)getActivity().findViewById(R.id.viewPager);viewPager.setAdapter(new MyPagerAdapter(list));viewPager.setOnPageChangeListener(new PageChangeListener((MainActivity)getActivity()));}private TextView newTextView(String text) {TextView tv = new TextView(getActivity());tv.setText(text);tv.setTextSize(30);tv.setGravity(Gravity.CENTER);return tv;}/*** @author:Jack Tony 这里配置适配器* @tips :这里传入一个list数组,从每个list中可以剥离一个view并显示出来* @date :2014-9-24*/public class MyPagerAdapter extends PagerAdapter {private ArrayList<View> mViewList;private int pagerNum = 0;public MyPagerAdapter(ArrayList<View> viewList) {mViewList = viewList;}public int getPagerNum() {return pagerNum;}@Overridepublic int getCount() {return mViewList.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {if (mViewList.get(arg1) != null) {((ViewPager) arg0).removeView(mViewList.get(arg1));}}@Overridepublic Object instantiateItem(View arg0, int arg1) {try {if (mViewList.get(arg1).getParent() == null) {((ViewPager) arg0).addView(mViewList.get(arg1), 0);} else {/** 很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,* 所以得解绑不这样做否则会产生 viewpager java.lang.IllegalStateException:* The specified child already has a parent. You must call* removeView() on the child's parent first.*/((ViewGroup) mViewList.get(arg1).getParent()).removeView(mViewList.get(arg1));((ViewPager) arg0).addView(mViewList.get(arg1), 0);}} catch (Exception e) {e.printStackTrace();} finally {pagerNum = arg1;}return mViewList.get(arg1);}}}
3.2设置ViewPager的滑动监听,滑动时要求tab也需要跟着变换,并且滑动到最左边的界面时将触控范围变为全屏有效。
PageChangeListener
package com.kale.slidingmenutest.listener;import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity;import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.kale.slidingmenutest.MainActivity;public class PageChangeListener implements ViewPager.OnPageChangeListener {private ActionBarActivity activity;public PageChangeListener(ActionBarActivity activity) {this.activity = activity;}@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO 自动生成的方法存根 }@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO 自动生成的方法存根 }@Overridepublic void onPageSelected(int position) {//System.out.println("position:" + position); activity.getSupportActionBar().setSelectedNavigationItem(position);//设置在其他页面滑动时slingmenu是边缘模式,最边上页面是全屏模式(防误触)switch (position) {case 0: ((MainActivity)activity).getMySlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);break;default: ((MainActivity)activity).getMySlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);break;}} }
3.3MyTabListener
注意:要判断viewpager是否为空
package com.kale.slidingmenutest.listener;import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar.Tab;/*** @author:Jack Tony* @tips :设置tab的监听器,控制viewpager的显示* @date :2014-7-30*/ public class MyTabListener implements ActionBar.TabListener {ViewPager viewPager;public MyTabListener(ViewPager viewPager) {this.viewPager = viewPager;}@Overridepublic void onTabReselected(Tab arg0, FragmentTransaction arg1) {}/* 核心方法* @see android.support.v7.app.ActionBar.TabListener#onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction)* 选中某个tab时,同时切换viewpager*/@Overridepublic void onTabSelected(Tab tab, FragmentTransaction arg1) {if (viewPager != null && viewPager.getCurrentItem() != tab.getPosition()) {viewPager.setCurrentItem(tab.getPosition());}}@Overridepublic void onTabUnselected(Tab arg0, FragmentTransaction arg1) {}}
源码下载:http://download.csdn.net/detail/shark0017/7976759
无需SherlockActionbar的SlidingMenu使用详解(二)——向Fragment中添加ViewPager和Tab相关推荐
- 无需SherlockActionbar的SlidingMenu使用详解(一)——通过SlidingMenu设置容器并解决滑动卡顿的问题
无需SherlockActionbar的SlidingMenu使用详解(一)--通过SlidingMenu设置容器并解决滑动卡顿的问题 参考文章: (1)无需SherlockActionbar的Sli ...
- P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
目录 1.内容概述 2.反向链接技术:一种特殊的P2P场景(通信双方中只有一方位于NAT设备之后) 3.基于UDP协议的P2P打洞技术详解 3.1.原理概述 3.2.典型P2P情景1: 两客户端位于同 ...
- Java面试题详解二:java中的关键字
一,final 1.被final修饰的类不可以被继承 2.被final修饰的方法不可以被重写 3.被final修饰的变量不可以被改变 重点就是第三句.被final修饰的变量不可以被改变,什么不可以 ...
- Android Fragment详解(二):Fragment创建及其生命周期
Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To c ...
- OS--进程间通信详解(二)
OS–进程间通信详解(二) 文章目录 OS--进程间通信详解(二) 一.进程间通信 1.互斥量 Futexes Pthreads中的互斥量 2.管程 3.消息传递 消息传递系统的设计要点 用消息传递解 ...
- Unicode编码详解(二):编码预备知识
Unicode编码详解(二):编码预备知识 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对字符的 ...
- 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- PopUpWindow使用详解(二)——进阶及答疑
相关文章: 1.<PopUpWindow使用详解(一)--基本使用> 2.<PopUpWindow使用详解(二)--进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...
最新文章
- iOS应用架构谈 组件化方案
- 转载:C++ list 类学习笔记
- agv调度matlab程序,AGV调度方法入门
- [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向...
- 2018-2019-1 20165219 实验三 实时系统
- 看懂架构设计中的服务隔离
- 谷歌发布AdaNet,快速灵活的AutoML工具,帮助开发者构筑强大集成学习模型
- 如何判断一颗二叉树为完全二叉树
- php框架 事件,php框架Minor5事件(附代码)
- 自己在OC考试中的试题
- 一禅小和尚的人生哲学
- 解析几何 直线与平面 直线与平面(1.2)
- 计算机表格复制粘贴,在Excel同一个工作表中,如何复制表格格式(excel表格粘贴复制技巧)...
- Linux系统备份与还原-Clonezilla
- P-touch Editor 批量打印标签
- 采药(c语言贪心算法)
- sobel算子,scharr算子,Laplacian算子
- python是一种编程语言吗?,python语言是编程语言吗
- android 相对布局 靠右,Android开发RelativeLayout相对布局的属性
- oracle 安装 status -2,Oracle 12.2 OJVM安装
热门文章
- Redis集群监控及Redis桌面客户端
- deque python_3 . python Collections -- Deque Object
- 跟计算机有关的比赛策划,计算机协会“装机大赛”活动策划书
- linux date 天之前,linux date命令前后几天的推导
- 中对曲线进行斜率提取_Au中的EQ处理方法——图形均衡器和参数均衡器
- $@ $# $2 $0 $* Linux 参数使用
- keepalived VS zookeeper
- 2022经营新增长第一课
- 互联网晚报 | 10月30日 星期六 | 微软市值超越苹果;华为前三季度销售收入4558亿元;《长津湖》成2021全球票房冠军...
- 真正的OKR是什么?