我的长大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

时间: 2024-08-30 12:00:10

我的长大app开发教程第三弹:实现四个子页面绑定RadioButton的相关文章

我的长大app开发教程第一弹:Fragement布局

在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发"我的长大"这个Android应用. 在开始之前,我先来介绍一下"我的长大":这是一个校园社交app,准确点说是一个资讯+社交的校园app.目标用户是在校大学生,老师.项目初期提供的功能有:校园资讯,校园服务,校园问答,核心的社交功能会在稍后视情况推出.我们的竞争对手有微信,QQ,空间,微博,知乎...等杀手级应用,所以我们压力还是有点大,但是,还有机会(逃...当我没说

我的长大app开发教程第二弹:完成ContentFragment底部按钮

在开始之前,先上一张效果图 突然发现有点知乎的味道...的确..知乎灰#989898,知乎蓝15,136,235(逃.... 1.学P图 想我大一的时候也用过不少Adobe的软件,昨天重新打开我的Photoshop,电脑提示缺少什么.dll文件,最后弄了一上午,是因为vc2012的运行库出了问题,最后发现一个软件特别好用:DirectX Repair,可以完美解决.dll丢失的问题. UI素材我是在google的icons素材库下载的https://github.com/google/mater

微信公众平台开发教程(三) 基础框架搭建

微信公众平台开发教程(三) 基础框架搭建 上一章,我们已经初步讲解了微信公众账号开发的基本原理,今天我们来探索设计实现. 首先我们设计了模块层次图,当然图中只是给出一种实现方式,不局限于此.具体见下图. 主要功能介绍如下: 1)请求接口层.处理HTTP请求,及响应 2)分发层.由接口层传入请求,然后具体分析请求类型,分发至不同的处理器 3)业务逻辑层.这里是我们的具体业务逻辑了,根据请求,实现具体的业务逻辑. 4)数据层.我们在实现某个应用时可能需要访问数据,可以是数据库或者是文件.如果是简单应

Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证 要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方审核,审核通过之后,会在后台顶部出现“高级功能”菜单. 使用“高级功能”>“开发模式”之前,必须有一个已经部署在Internet上,可以用80端口访问的网站(域名或IP访问都可以),一些开发的准备工作见文

WPF 3D开发教程(三)

原文:WPF 3D开发教程(三) 三.3D模型 3D模型就是物体,是3D开发中的主角.我们在第一部分提过,使用三角网格法表示面.而三角形由顶点组成,每个面又有一定的材质,这些都是怎么表示的呢?三角形面由Positions和TriangleIndices两个属性确定,而材质的显示主要由TextureCoordinates和Material两个属性确定.我们具体解释一下这些属性. 3.1 Positions和TriangleIndices 我们举一个简单的例子说明问题.假设我们要表示如下一个平面:

AndroidStudio使用教程(第三弹)

AndroidStudio使用教程(第三弹) 熟悉了基本的使用之后,可能关心的就是版本控制了. SVN 下载Subversion command line 方法一 下载地址是Subversion里面有不同系统的版本. 以Windows为例,我们采用熟悉的VisualSVN. 进入下载页后下载Apache Subversion command line tools, 解压即可. 方法二 Windows下的Tortoise SVN也是带有command line的,但是安装的时候默认是不安装这个选项

AI技术在短视频APP开发中的应用主要在于四个方面

你平均每天花在短视频APP上的时间是多久? 你目前使用最长时间的一款短视频APP是什么? 移动短视频APP开发可以在这四个方面应用AI技术 移动短视频APP开发可以在这四个方面应用AI技术 短视频APP已经成为了我们生活中消遣娱乐的一种普遍方式,移动短视频APP可以随时随地想看就看,比阅读文字更加简单便捷,而且还可以缓解工作,学习的压力,而且在不知不觉中刷一下短视频APP时间过的非常快,不仅如此还能利用移动短视频APP了解自内心新闻以及流行的话题等等,还能结交新的朋友,增加与朋友互动的频率. 移

一看就懂的手机APP开发教程

现在的移动互联网属于全民的狂欢时代,是每个人.每个用户.每个企业的欢畅淋漓的时代,所以APP正在势如破竹地开拓广阔的市场.手机APP开发指的是专注于手机应用软件开发与服务,是当前最为迫切的需求.无独有偶,APICloud产品的业务就是APP开发平台,构建一个平台为用户服务. APICloud产品为移动开发者从"云"和"端"两个方向提供API,不仅简化移动应用开发技术,而且大幅提升移动应用开发和管理的效率.手机APP开发需要的便是简单的方式和便捷的方式,选择一款合适的

微信公众账号开发教程(三) 实例入门:机器人

一.功能介绍 通过微信公众平台实现在线客服机器人功能.主要的功能包括:简单对话.查询天气等服务. 这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程.只是一个简单DEMO,如果需要的话可以在此基础上进行扩展. 当然后续我们还会推出比较复杂的应用实例. 二.具体实现 1.提供访问接口 这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建http://www.cnblogs.com/yank/p/3392394.html 2.签名认证和分发请求 这里不再赘述,参照上