我的长大app开发教程第三弹:实现四个子页面绑定RadioButton
在开始之前先上一张图

在上一节中我们实现了底部Button,这一弹我们要实现点击四个按钮分别切换到不同页面,我们可以把页面分为两部分,顶部栏和中间内容部分,我们可以通过线性布局包裹两部分内容,顶部栏又是一个线性布局:一个TextView,一个ImageButton,中间内容采用帧布局。
1、项目结构:

2、四个页面的基类BasePager
package com.vitoyan.myangtzeu.base; import android.content.Context;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView; import com.vitoyan.myangtzeu.R;
import com.vitoyan.myangtzeu.activity.MainActivity; /**
* 作者:Vito-Yan
* 作用:基类或者说公共类
* HomePager,TopicPager,FindPager,MyPager都继承BasePager
*/
public class BasePager { /**
* 上下文
*/
public final Context context;//MainActivity /**
* 视图,代表各个不同的页面
*/
public View rootView;
/**
* 显示标题
*/
public TextView tv_title; /**
* 点击侧滑的
*/
public ImageButton ib_menu; /**
* 加载各个子页面
*/
public FrameLayout fl_content; public BasePager(Context context) {
this.context = context;
//构造方法一执行,视图就被初始化了
rootView = initView();
} /**
* 用于初始化公共部分视图,并且初始化加载子视图的FrameLayout
* @return
*/
private View initView() {
//基类的页面
View view = View.inflate(context, R.layout.base_pager,null);
tv_title = (TextView) view.findViewById(R.id.tv_title);
ib_menu = (ImageButton) view.findViewById(R.id.ib_menu);
fl_content = (FrameLayout) view.findViewById(R.id.fl_content);
ib_menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity mainActivity = (MainActivity) context;
mainActivity.getSlidingMenu().toggle();//关<->开
}
});
return view;
} /**
* 初始化数据;当孩子需要初始化数据;或者绑定数据;联网请求数据并且绑定的时候,重写该方法
*/
public void initData(){ }
}
3、首页HomePager继承BasePager,重写initData方法,加载数据
package com.vitoyan.myangtzeu.pager; import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView; import com.vitoyan.myangtzeu.base.BasePager;
import com.vitoyan.myangtzeu.utils.LogUtil; /**
* 作者:Vito-Yan
* 作用:首页页面
*/
public class HomePager extends BasePager {
public HomePager(Context context) {
super(context);
} @Override
public void initData() {
super.initData();
LogUtil.e("首页页面数据被初始化了..");
ib_menu.setVisibility(View.VISIBLE);
//1.设置标题
tv_title.setText("资讯");
//2.联网请求,得到数据,创建视图
TextView textView = new TextView(context);
textView.setGravity(Gravity.CENTER);
textView.setTextColor(Color.BLACK);
textView.setTextSize(25);
//3.把子视图添加到BasePager的FrameLayout中
fl_content.addView(textView);
//4.绑定数据
textView.setText("首页页面内容"); }
}
4、titlebar.xml:顶部栏布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/top_tab_bg"> <TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="资讯"
android:textColor="@android:color/black"
android:textSize="23sp" /> <ImageButton
android:id="@+id/ib_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:background="@android:color/transparent"
android:src="@drawable/menu_black"
android:visibility="gone" /> </RelativeLayout>
5、base_pager.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"> <!--标题栏-titlebar-->
<include layout="@layout/titlebar"/>
<!--各个页面的视图,都是添加到FrameLayout里面,addView-->
<FrameLayout
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="match_parent"/> </LinearLayout>
6、ContentFragment:
在ContentFragment中,设置了ViewPager的适配器,增加了两个内部类和一个私有方法
ContentFragmentAdapter:初始化各个页面的实例
MyOnCheckedChangeListener:把四个页面放入ArrayList集合中,通过绑定各个页面的id,达到切换的效果
MyOnPageChangeListener:通过监听某个具体的页面,返回选中页面的位置,在适配器中只用初始化一个单独页面而不是几个页面,优化资源,提高效率。isEnableSlidingMenu:是否可以左侧滑动的方法
package com.vitoyan.myangtzeu.fragment; import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.RadioGroup; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.vitoyan.myangtzeu.R;
import com.vitoyan.myangtzeu.activity.MainActivity;
import com.vitoyan.myangtzeu.adapter.ContentFragmentAdapter;
import com.vitoyan.myangtzeu.base.BaseFragment;
import com.vitoyan.myangtzeu.base.BasePager;
import com.vitoyan.myangtzeu.pager.FindPager;
import com.vitoyan.myangtzeu.pager.HomePager;
import com.vitoyan.myangtzeu.pager.MyPager;
import com.vitoyan.myangtzeu.pager.TopicPager;
import com.vitoyan.myangtzeu.utils.LogUtil;
import com.vitoyan.myangtzeu.view.NoScrollViewPager; import org.xutils.view.annotation.ViewInject;
import org.xutils.x; import java.util.ArrayList; /**
* 作者:Vito-Yan
* 作用:正文Fragment
*/
public class ContentFragment extends BaseFragment { //2.初始化控件
@ViewInject(R.id.viewpager)
private NoScrollViewPager viewpager; @ViewInject(R.id.rg_main)
private RadioGroup rg_main; /**
* 装五个页面的集合
*/
private ArrayList<BasePager> basePagers; @Override
public View initView() {
LogUtil.e("正文视图被初始化了");
View view = View.inflate(context, R.layout.content_fragment,null);
// viewpager = view.findViewById(R.id.viewpager);
// rg_main = view.findViewById(R.id.rg_main);
//1.把视图注入到框架中,让ContentFragment.this和View关联起来
x.view().inject(ContentFragment.this,view);
return view;
} @Override
public void initData() {
super.initData();
LogUtil.e("正文数据被初始化了"); //初始化四个页面,并且放入集合中
basePagers = new ArrayList<>();
basePagers.add(new HomePager(context));//首页页面
basePagers.add(new TopicPager(context));//话题页面
basePagers.add(new FindPager(context));//发现页面
basePagers.add(new MyPager(context));//我的页面 //设置ViewPager的适配器
viewpager.setAdapter(new ContentFragmentAdapter(basePagers)); //设置RadioGroup的选中状态改变的监听
rg_main.setOnCheckedChangeListener(new MyOnCheckedChangeListener()); //监听某个页面被选中,初始对应的页面的数据
viewpager.addOnPageChangeListener(new MyOnPageChangeListener()); basePagers.get(0).initData(); //设置默认选中首页
rg_main.check(R.id.rb_home); //设置模式SlidingMenu不可以滑动
isEnableSlidingMenu(SlidingMenu.TOUCHMODE_NONE);
} class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { @Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /**
* 当某个页面被选中的时候回调这个方法
* @param position 被选中页面的位置
*/
@Override
public void onPageSelected(int position) {
// BasePager basePager = basePagers.get(position);
//调用被选中的页面的initData方法
basePagers.get(position).initData();
} @Override
public void onPageScrollStateChanged(int state) { }
} class MyOnCheckedChangeListener implements RadioGroup.OnCheckedChangeListener { /**
*
* @param group RadioGroup
* @param checkedId 被选中的RadioButton的id
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.rb_home://首页radioButton的id
viewpager.setCurrentItem(0,false);
isEnableSlidingMenu(SlidingMenu.TOUCHMODE_FULLSCREEN);
break;
case R.id.rb_topic://话题radioButton的id
viewpager.setCurrentItem(1,false);
isEnableSlidingMenu(SlidingMenu.TOUCHMODE_NONE);
break;
case R.id.rb_find://发现radioButton的id
viewpager.setCurrentItem(2,false);
isEnableSlidingMenu(SlidingMenu.TOUCHMODE_NONE);
break;
case R.id.rb_my://我的RadioButton的id
viewpager.setCurrentItem(3,false);
isEnableSlidingMenu(SlidingMenu.TOUCHMODE_NONE);
break;
} }
} /**
根据传人的参数设置是否让SlidingMenu可以滑动
*/
private void isEnableSlidingMenu(int touchmodeFullscreen) {
MainActivity mainActivity = (MainActivity) context;
mainActivity.getSlidingMenu().setTouchModeAbove(touchmodeFullscreen);
} }
7、ContentFragmentAdapter
package com.vitoyan.myangtzeu.adapter; import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup; import com.vitoyan.myangtzeu.base.BasePager; import java.util.ArrayList; /**
* 作者:Vito-Yan
* 作用:ContentFragmentAdapter
*/
public class ContentFragmentAdapter extends PagerAdapter { private final ArrayList<BasePager> basePagers; public ContentFragmentAdapter(ArrayList<BasePager> basePagers){
this.basePagers = basePagers;
} @Override
public int getCount() {
return basePagers.size();
} @Override
public Object instantiateItem(ViewGroup container, int position) {
BasePager basePager = basePagers.get(position);//各个页面的实例
View rootView = basePager.rootView;//各个子页面
//调用各个页面的initData()
// basePager.initData();//初始化数据
container.addView(rootView);
return rootView;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view ==object;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
具体源代码可以在我的github上查看:https://github.com/Vito-Yan/MYangtzeu
我的长大app开发教程第三弹:实现四个子页面绑定RadioButton的更多相关文章
- 我的长大app开发教程第一弹:Fragment布局
在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...
- 我的长大app开发教程第二弹:完成ContentFragment底部按钮
在开始之前,先上一张效果图 突然发现有点知乎的味道...的确..知乎灰#989898,知乎蓝15,136,235(逃.... 1.学P图 想我大一的时候也用过不少Adobe的软件,昨天重新打开我的Ph ...
- NeuChar 平台使用及开发教程(三):使用 NeuChar 的菜单服务
上一篇<NeuChar 平台使用及开发教程(二):设置平台账号>我们已经完成了平台账号的设置,下面就马上来体验一下自定义菜单的设置吧! 进入某个 Neural Cell 的设置界面,在右侧 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...
- iOS 11开发教程(三)运行第一个iOS 11程序
iOS 11开发教程(三)运行第一个iOS 11程序 运行iOS11程序 创建好项目之后,就可以运行这个项目中的程序了.单击运行按钮,如果程序没有任何问题的话,会看到如图1.6和1.7的运行效果. 图 ...
- EnjoyingSoft之Mule ESB开发教程第三篇:Mule message structure - Mule message结构
目录 1. 探索Mule Message结构 2. Mule Message的Payload 3. Mule Message的Property 4. Mule Message的Attachment 5 ...
- 微信公众账号开发教程(三) 实例入门:机器人(附源码) ——转自http://www.cnblogs.com/yank/p/3409308.html
一.功能介绍 通过微信公众平台实现在线客服机器人功能.主要的功能包括:简单对话.查询天气等服务. 这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程.只是一个简单DEMO,如果需要 ...
- SharePoint 2013 APP 开发示例 (三)使用远程的web资源
在这个示例里我们将详细介绍 TokenHelper 类, 我们将看到它是怎么简单地从远程web站点访问SharePoint的.我们还将取到它的一些值.这将帮助我们理解连接是怎么被构造的,同时也方便我们 ...
- Android蓝牙开发教程(三)——蓝牙设备相互通讯
在上一篇中已经介绍如何连接我们搜索到的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(二)——连接蓝牙设备 在上一篇文章中,无论是自动连接还是被动连接,连接成功后,都是将获 ...
随机推荐
- android 读取EXcel 文件 读取文件内存卡的权限
android 采用Java的读取xls文件的方式实现. 需要导入第三方Jxl.jar 包. 代码改自 其他博主 : 这只摘录下 读取xls文件的部分代码,当然这个代码在安卓平台需要添加下面的权限 ...
- 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)
[UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...
- css基本语法及页面引用
css基本语法 css的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个值.代码示例: div{ w ...
- [WC2008]游览计划 解题报告
[WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...
- Naive Operations HDU6315 (杭电多校2G)
让ci = ai / bi, 求sum(ci)的值,因为每次 ai 都是加一的,那么我可以用一颗线段树来维护每个 i 位置的 ai 距离达到 bi 还需要的数的最小值,更新是每次都减一,如果我某一个区 ...
- [SDOI2015]序列统计(多项式快速幂)
题目描述 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问 ...
- 解决关于confluence缓慢 字体乱码 宏乱码 编辑不能贴图等问题
应用场景:Confluence软件不用多说,与Jira一样,都是atlassion的精品软件,不再介绍. 这里因为使用的是破解版的confluence,故遇见一些问题,只能百度谷歌自行解决,也在此记录 ...
- Python学习day4 数据类型Ⅱ(列表,元祖)
day4 知识补充&数据类型:列表,元祖 1.知识补充 1.编译型/解释型 编译型:在代码编写完成之后编译器将其变成另外一个文件教给你算计执行. 代表语言:Java,c,c++ ,c#, Go ...
- poj1958 strange towers of hanoi
说是递推,其实也算是个DP吧. 就是4塔的汉诺塔问题. 考虑三塔:先从a挪n-1个到b,把最大的挪到c,然后再把n-1个从b挪到c,所以是 f[i] = 2 * f[i-1] + 1; 那么4塔类似: ...
- 【POJ2230】Watchcow
题目大意:给定一个 N 个点,M 条边的无向图,要求不重复地经过每条边两次,并且从 1 号节点出发最后回到 1 号节点,求一条路径. 题解:不重复地经过两次这个操作很容易地通过无向图的建边方式来实现, ...