由于在主页面现在内容是一个空的Fragment,现在需要往这个空的Fragment添加有内容的Fragment.
最终的实现效果是:
可以看出
1 下面一排是RadioButton
2 页面切换可以看做变化的Viewpager作为底板
3 ViewPager上使用线性布局的方式,放入不同的标题,以及内容(内容依旧使用Fragment布局方式进行填充)
下面是用于填充空Fragment的XML布局,是橘黄色框和浅蓝色框的布局实现。
<?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"> <!-- 这里调用了自定义了一个继承ViewPager的类:NoScrollViewPager,这个类重写了 onTouchEvent,使其不产生左右滑动的效果--> <com.example.zhihuibj.view.NoScrollViewPager android:id="@+id/vp_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <RadioGroup android:id="@+id/rg_group" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@android:color/darker_gray" > <RadioButton android:id="@+id/rb_home" style="@style/BottomTab" android:text="首页" android:drawableTop="@drawable/btn_tab_home_selector" /> <RadioButton android:id="@+id/rb_news" style="@style/BottomTab" android:text="新闻中心" android:drawableTop="@drawable/btn_tab_news_selcetor" /> <RadioButton android:id="@+id/rb_smart" style="@style/BottomTab" android:text="智慧服务" android:drawableTop="@drawable/btn_tab_smart_selector" /> <RadioButton android:id="@+id/rb_gov" style="@style/BottomTab" android:text="政 务" android:drawableTop="@drawable/btn_tab_gov_selector" /> <RadioButton android:id="@+id/rb_setting" style="@style/BottomTab" android:text="设置" android:drawableTop="@drawable/btn_tab_setting_selector" /> </RadioGroup> </LinearLayout>
下面的XML布局方式是对ViewPager内容进行填充布局,这里可以把ViewPager看做一个底板,在ViewPager上进行不同布局的添加。
<?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" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/title_red_bg" > <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="智慧北京" android:textColor="#fff" android:textSize="22sp" /> <ImageButton android:id="@+id/btn_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:background="@null" android:layout_centerHorizontal="true" android:layout_marginLeft="5dp" android:src="@drawable/img_menu" /> </RelativeLayout> <FrameLayout android:id="@+id/fl_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </FrameLayout> </LinearLayout>
首先创建一个继承Fragment类的BaseFragment类,用于实现Fragment的依赖的创建以及其他的初始化接口:
public abstract class BaseFragment extends Fragment{ public Activity mActivity; //fragment创建 @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); mActivity=getActivity(); //得到当前的Activity即MainActivity } //处理fragment布局 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return initViews(); } //依赖的Activity创建完成 @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); initData(); } //子类必须实现初始化方法 public abstract View initViews(); //初始化 public void initData(){}; }
在创建一个ContentFragment类,继承BaseFragment, 用来填充数据和更改页面内容:
/* * 主页面 */ public class ContentFragment extends BaseFragment{ @ViewInject(R.id.rg_group) //xUtils注解方式查找控件 private RadioGroup rgGroup; @ViewInject(R.id.vp_content)//得到Viewpager private ViewPager viewpager; private ArrayList<BasePager> mPagerList; @Override public View initViews() { /* * 将XML布局进行实例化 */ View view= View.inflate(mActivity, R.layout.fragment_content_menu, null); //rgGroup=(RadioGroup) view.findViewById(R.id.rg_group); //在view中寻找别控件 ViewUtils.inject(this,view);//注解View事件 return view; } @Override public void initData() { rgGroup.check(R.id.rb_home); mPagerList=new ArrayList<BasePager>(); /* * * 他们都继承了Basepager(自定义),向mPagerList添加用于显示不同页面的布局对象 * 在适配器(ContentAdapter)中,通过不同布局对象获得最终的布局实例mRootView */ mPagerList.add(new Homepager(mActivity)); mPagerList.add(new NewsCenterPager(mActivity)); mPagerList.add(new SmartServicePager(mActivity)); mPagerList.add(new GovAffairPager(mActivity)); mPagerList.add(new SettingPager(mActivity)); viewpager.setAdapter(new ContentAdapter()); /* * 设置监听RadioGroup事件 */ rgGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb_home: viewpager.setCurrentItem(0, false); //用于选中显示哪一个viewpager break; case R.id.rb_news: viewpager.setCurrentItem(1, false); break; case R.id.rb_smart: viewpager.setCurrentItem(2, false); break; case R.id.rb_gov: viewpager.setCurrentItem(3, false); break; case R.id.rb_setting: viewpager.setCurrentItem(4, false); break; default: break; } } }); mPagerList.get(0).initData(); //在未被选中时,对第一个页面进行初始化 /* * 监听ViewPager改变事件,用于监听哪一个页面被选中,并进行数据初始化 */ viewpager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { mPagerList.get(arg0).initData(); //对于每一个选中的viewpager进行数据初始化 } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } /* * 继承PagerAdapter的适配器,用于ViewPager的设置与显示 */ class ContentAdapter extends PagerAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return mPagerList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0==arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object);//销毁view } @Override public Object instantiateItem(ViewGroup container, int position) { BasePager pager=mPagerList.get(position); container.addView(pager.mRootView);//获得View ,添加进入的是由falter对R.layout.base_pager实例化的对象 return pager.mRootView; //用于销毁View } } }
数据内容的实现:
/* * 主页下五个子页的基类 * */ public class BasePager { public Activity mAcitivty; public View mRootView; //布局对象 public TextView tvTitle; //标题 public FrameLayout flcontent; //内容 public ImageButton btnMenu; public BasePager(Activity activity) { mAcitivty=activity; initViews(); //初始化布局 } /* * 布局初始化 */ public void initViews(){ mRootView=View.inflate(mAcitivty, R.layout.base_pager, null); //获得数据布局XML实例 btnMenu=(ImageButton)mRootView.findViewById(R.id.btn_menu); tvTitle=(TextView) mRootView.findViewById(R.id.tv_title); flcontent=(FrameLayout) mRootView.findViewById(R.id.fl_content); } /* * 数据初始化 */ public void initData(){ } public void setSlidingMenuEnable(boolean enable) { MainActivity MainUi= (MainActivity)mAcitivty; SlidingMenu slidingmenu = MainUi.getSlidingMenu(); if(enable) { slidingmenu.setTouchModeAbove(slidingmenu.TOUCHMODE_FULLSCREEN); } else { slidingmenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); } } }
/* * 首页(五个子页面之一) */ public class Homepager extends BasePager { public Homepager(Activity activity) { super(activity); } @Override public void initData() { tvTitle.setText("智慧北京"); setSlidingMenuEnable(false); //向flcontent动态加载数据 TextView text=new TextView(mAcitivty); text.setText("首页"); text.setTextColor(Color.RED); text.setTextSize(25); text.setGravity(Gravity.CENTER); flcontent.addView(text); } }