之前我们对大体框架有了一定的认识,现在我们来做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相关推荐

  1. 无需SherlockActionbar的SlidingMenu使用详解(一)——通过SlidingMenu设置容器并解决滑动卡顿的问题

    无需SherlockActionbar的SlidingMenu使用详解(一)--通过SlidingMenu设置容器并解决滑动卡顿的问题 参考文章: (1)无需SherlockActionbar的Sli ...

  2. P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解

    目录 1.内容概述 2.反向链接技术:一种特殊的P2P场景(通信双方中只有一方位于NAT设备之后) 3.基于UDP协议的P2P打洞技术详解 3.1.原理概述 3.2.典型P2P情景1: 两客户端位于同 ...

  3. Java面试题详解二:java中的关键字

    一,final 1.被final修饰的类不可以被继承 2.被final修饰的方法不可以被重写 3.被final修饰的变量不可以被改变   重点就是第三句.被final修饰的变量不可以被改变,什么不可以 ...

  4. Android Fragment详解(二):Fragment创建及其生命周期

    Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To c ...

  5. OS--进程间通信详解(二)

    OS–进程间通信详解(二) 文章目录 OS--进程间通信详解(二) 一.进程间通信 1.互斥量 Futexes Pthreads中的互斥量 2.管程 3.消息传递 消息传递系统的设计要点 用消息传递解 ...

  6. Unicode编码详解(二):编码预备知识

    Unicode编码详解(二):编码预备知识 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对字符的 ...

  7. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  8. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  9. PopUpWindow使用详解(二)——进阶及答疑

    相关文章: 1.<PopUpWindow使用详解(一)--基本使用> 2.<PopUpWindow使用详解(二)--进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

最新文章

  1. iOS应用架构谈 组件化方案
  2. 转载:C++ list 类学习笔记
  3. agv调度matlab程序,AGV调度方法入门
  4. [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向...
  5. 2018-2019-1 20165219 实验三 实时系统
  6. 看懂架构设计中的服务隔离
  7. 谷歌发布AdaNet,快速灵活的AutoML工具,帮助开发者构筑强大集成学习模型
  8. 如何判断一颗二叉树为完全二叉树
  9. php框架 事件,php框架Minor5事件(附代码)
  10. 自己在OC考试中的试题
  11. 一禅小和尚的人生哲学
  12. 解析几何 直线与平面 直线与平面(1.2)
  13. 计算机表格复制粘贴,在Excel同一个工作表中,如何复制表格格式(excel表格粘贴复制技巧)...
  14. Linux系统备份与还原-Clonezilla
  15. P-touch Editor 批量打印标签
  16. 采药(c语言贪心算法)
  17. sobel算子,scharr算子,Laplacian算子
  18. python是一种编程语言吗?,python语言是编程语言吗
  19. android 相对布局 靠右,Android开发RelativeLayout相对布局的属性
  20. oracle 安装 status -2,Oracle 12.2 OJVM安装

热门文章

  1. Redis集群监控及Redis桌面客户端
  2. deque python_3 . python Collections -- Deque Object
  3. 跟计算机有关的比赛策划,计算机协会“装机大赛”活动策划书
  4. linux date 天之前,linux date命令前后几天的推导
  5. 中对曲线进行斜率提取_Au中的EQ处理方法——图形均衡器和参数均衡器
  6. $@ $# $2 $0 $* Linux 参数使用
  7. keepalived VS zookeeper
  8. 2022经营新增长第一课
  9. 互联网晚报 | 10月30日 星期六 | 微软市值超越苹果;华为前三季度销售收入4558亿元;《长津湖》成2021全球票房冠军...
  10. 真正的OKR是什么?