`
men4661273
  • 浏览: 278275 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

fragment+viewpager+radioButton设计滑动导航界面

阅读更多

       最近学习到了viewpager的使用,利用fragment+viewpager+radioButton组合进行了一个导航菜单加界面的开发,再次分享一下,自己也算是复习一下。

       首先新建一个工程,我现在的这个sdk的版本,新建工程默认创建一个activity,使用的是fragment实现,用着不太习惯,我一般会修改为原来的模式,一个activity,加载一个layout作为主界面,然后删掉多余的代码,运行一下,主界面出来了:



        然后我们在界面布局文件中区调textview,,放一个viewpager的组件,铺满全屏幕:

    <android.support.v4.view.ViewPager
        android:id="@+id/mViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

        新建三个布局文件,很简单的就行,分别有一个按钮,作为我们viewpager里面的界面元素,这里就不列出来了。

        接下来新建三个fragment的类,继承自v4的Fragment,并重写其onCreateView方法,初始化将每个Fragment的界面,下面列出其中一个代码片段:

package com.example.fragmentviewpager;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentOne extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_page1, container,false);
		return view;
	}
}

         接下来就要在activity中去初始化viewpager啦,先实例化viewpager对象,拿到我们的控件,并初始化Fragment数组,

private ViewPager viewPager;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		viewPager = (ViewPager)findViewById(R.id.mViewPager);
		Fragment fragmentOne = new FragmentOne();
  
                Fragment fragmentTwo = new FragmentTwo();
  
                Fragment fragmentThree = new FragmentThree();
  
                fragments = new Fragment[]{fragmentOne,fragmentTwo,fragmentThree};
	}

        然后我们就要给它设置适配器,还没有,我们创建一个适配器类,继承自FragmentPagerAdapter,然后重写父类的抽象法方法,重写构造方法,构造数据源,可以直接写在activity中,作为内部类:

class MyViewPagerAdapter extends FragmentPagerAdapter{

		public MyViewPagerAdapter(FragmentManager fm) {
			super(fm);
		}

		@Override
		public Fragment getItem(int index) {
			return fragments[index];
		}

		@Override
		public int getCount() {
			return fragments.length;
		}
		
	}

         接下来在onCreate方法中初始化我们的adapter,给viewpager设置上:

		MyViewPagerAdapter adapter = new MyViewPagerAdapter(getSupportFragmentManager());
		viewPager.setAdapter(adapter);

 

        运行一下,我们的viewpager+fragment就出现啦!fragment的好处就是可以与activity进行分离,传统的方式需要在activity中加载所有视图并初始化各种操作,造成activity代码杂乱。

 

       接下来我们就要开始添加标题,上下都可以,我把它放在上面, 标题栏放几个textView,设置其点击事件,并高亮当前选中页就可以,我采用radiobutton的方式,来进行切换。

        我们现在viewpager组件上面添加一个radiogroup,里面我们通过动态的方式创建radioButton,这样添加一页的布局文件不需要修改:

     <RadioGroup
          android:id="@+id/radioGroup"
          android:layout_width="match_parent"
          android:layout_height="38dip"
          android:layout_alignParentTop="true"
          android:background="#000000"
          android:orientation="horizontal" />

        然后我们新建一个radiobutton的布局文件nav_radiogroup_item.xml,设置一下radiobutton的样式,

 

<?xml version="1.0" encoding="utf-8"?>
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dip"
    android:layout_height="fill_parent"
    android:background="@drawable/rb_fouce_bg"
    android:button="@null"
    android:checked="false"
    android:gravity="center"
    android:text=""
    android:textColor="@drawable/rb_blue_bg"
    android:textSize="14.0dip" />

        可以看到radiobutton的样式中,背景和文字显示都使用了drawable的方式,使用了两个selector,处理单击以及选中时背景和文字的交替变化,两个selector文件如下:

       rb_blue_bg.xml处理文字颜色

<?xml version="1.0" encoding="UTF-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="#5AB0EB" />
    <item android:state_checked="false" android:color="#ffffff"/>
</selector>

       rb_fouce_bg.xml处理背景颜色

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@color/blue"/>
    <item android:drawable="@color/translate"></item>
</selector>

       在背景颜色处理是用到了color资源,在我们的colors.xml中定义需要的颜色:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="blue">#99FFFF</color>
    <color name="translate">#000000</color>
    <color name="black">#000000</color>
    <color name="white">#ffffff</color>
    <color name="green">#ff0000</color>
    <color name="red">#00ffff</color>
</resources>

        接下来处理标题资源文件,我们卸载arrays.xml里面,方便配置:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="titles">
        <item >页面1</item>
        <item >页面2</item>
        <item >页面3</item>
    </string-array>
</resources>

       

        资源文件处理完毕,现在开始代码处理,在activity中初始化radiogroup以及我们的标题数组:

		radioGroup = (RadioGroup)findViewById(R.id.radioGroup);
		titles = getResources().getStringArray(R.array.titles);

         接下来动态创建radiobutton添加到radiogroup中去,需要计算一下每个按钮的宽度:

		//计算每个标题的宽度
		Display display = getWindowManager().getDefaultDisplay();
		DisplayMetrics dm = new DisplayMetrics();
		display.getMetrics(dm);
		titleWidth = dm.widthPixels / titles.length;
		//动态添加radiobutton
		RadioButton rb = null;
		radioGroup.removeAllViews();
		LayoutInflater inflater = LayoutInflater.from(this);
		for (int i = 0; i < titles.length; i++) {
			//从布局中读取单选按钮布局
			 rb = (RadioButton)inflater.inflate(R.layout.nav_radiogroup_item, null);
			 //设置显示文字
			 rb.setText(titles[i]);
			 //设置id。不能丢,区分用
			 rb.setId(i);
			 rb.setLayoutParams(new LayoutParams(titleWidth,LayoutParams.MATCH_PARENT));
			 if (i == 0) {
				 rb.setChecked(true);
			 }
			 radioGroup.addView(rb);
		}

 

          运行一下,我们的标题出来了:

 

 

 

 

 

 

 

 

 

        但是和viewpager还不同步,下面开始写单选按钮时间和viewpager的选择事件:

 

 

 

//单选按钮事件
		radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				//选中时viewpager联动
				viewPager.setCurrentItem(checkedId);
			}
		});
		//viewpager选中事件
		viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
			
			@Override
			public void onPageSelected(int index) {
				//选中时模拟单选按钮的单击事件
				((RadioButton)radioGroup.getChildAt(index)).performClick();
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0) {
				
			}
		});

 

 

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
     <RadioGroup
          android:id="@+id/radioGroup"
          android:layout_width="match_parent"
          android:layout_height="38dip"
          android:layout_alignParentTop="true"
          android:background="#000000"
          android:orientation="horizontal" />
     <ImageView 
	    android:id="@+id/splitImage"
	    android:layout_below="@id/radioGroup"
	    android:layout_width="5dip"
	    android:layout_height="5dip"
	    android:background="#5AB0EB"
	    android:scaleType="matrix"/>
    <android.support.v4.view.ViewPager
        android:layout_below="@id/splitImage"
        android:id="@+id/mViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
 
 
  
splitImage = (ImageView)findViewById(R.id.splitImage);
		LayoutParams layoutParams = splitImage.getLayoutParams();
		layoutParams.width = titleWidth;
           修改单选按钮单击事件,增加imageView的动画效果:
//单选按钮事件
		radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				//选中时viewpager联动
				viewPager.setCurrentItem(checkedId);
				View radioButton = group.getChildAt(checkedId);
				//创建位移动画,从当前位置移动到新位置
				Animation animation = new TranslateAnimation(splitImageLeft, radioButton.getLeft(), 0f, 0f);
				animation.setDuration(300);
				animation.setFillAfter(true);
				splitImage.startAnimation(animation);
				//记录当前位置
				splitImageLeft = radioButton.getLeft();
			}
		});
    运行效果,差不多了:


 
  • 大小: 8.8 KB
  • 大小: 10 KB
  • 大小: 11.3 KB
  • 大小: 11.6 KB
分享到:
评论

相关推荐

    使用 Simulink(R) 在 AWGN 信道上执行带穿孔的软判决维特比解码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    极化码的高斯近似过程,基于matlab平台.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    广东省关于人工智能赋能千行百业的若干措施.docx

    广东省关于人工智能赋能千行百业的若干措施.docx

    湖北省数据条例(草案)(征求意见稿).docx

    湖北省数据条例(草案)(征求意见稿).docx

    CSS网站布局与开发技巧(pdf电子书)最新版本

    中软国际IT培训中心的培训教程,属于学习CSS网页设计的基础入门教程,讲一些原理和概念,高深的理论不太多。

    Python 中数据结构和算法的最少示例.zip

    Python Data Structures and Algorithms Minimal and clean example implementations of data structures and algorithms in Python 3. Contribute Thank you for your interest in contributing! There are many ways to contribute to the project. Start testing from here Take note when running all tests using unittest $ python3 -m unittest discover tests To run some specific tests you can do the following (e.g. sort) $ python3 -m unittest tests.test_sort Run all tests using pytest Make a note when $ python3 -m

    TeamIDE-win-2.6.31Team IDE 集成MySql、Oracle、金仓、达梦、神通等数据库、SSH、FTP、Redis、Zookeeper、Kafka、Elasticsearch、M

    TeamIDE-win-2.6.31Team IDE 集成MySql、Oracle、金仓、达梦、神通等数据库、SSH、FTP、Redis、Zookeeper、Kafka、Elasticsearch、M

    C/C++/Python/Java四种语言下的算法实现资源概览

    内容概要:本文综述了C、C++、Python、Java这四种主流编程语言中,用于实现常见和高级算法的学习资料,覆盖范围广泛,从书籍、在线课程平台到GitHub上的开源代码仓库均有提及。每种语言都详述了推荐的学习资源及其优势,旨在满足不同程度学习者的需要。 适合人群:对算法实现有兴趣的学生、自学爱好者、开发者等。 使用场景及目标:帮助读者挑选合适的语言和资源深入理解算法的理论与实际编码技巧,适用于个人提升、项目实践或教学使用。 其他说明:文章提供了丰富的学习渠道和实战项目,既适合作为基础理论的学习,也适合于实际操作练习,尤其强调通过实做加深理解的重要性。

    aiuiphone0000000000000000000

    aiuiphone0000000000000000000

    支持多场景回调开箱即用 原生仿百度登录验证.zip

    支持多场景回调开箱即用 原生仿百度登录验证.zip

    2023 年“泰迪杯”数据分析技能赛B题-企业财务数据分析与造假识别

    2023 年“泰迪杯”数据分析技能赛B题-企业财务数据分析与造假识别 完整代码

    Levenshtein Python C 扩展模块包含用于快速计算 Levenshtein 距离和字符串相似度的函数.zip

    Levenshtein Python C 扩展模块包含用于快速计算 Levenshtein 距离和字符串相似度的函数内容需要维护者介绍文档执照历史源代码作者需要维护者我 (Mikko Ohtamaa) 目前不维护此代码。我只是为了方便起见才将其拉到 Github 上的(之前在公共存储库中不可用)。因此,如果您提交了任何问题,我都不会调查。介绍Levenshtein Python C 扩展模块包含用于快速计算的函数Levenshtein(编辑)距离和编辑操作字符串相似度近似中位数字符串,以及一般字符串平均值字符串序列和集合相似度它同时支持普通字符串和 Unicode 字符串。需要 Python 2.2 或更新版本。StringMatcher.py 是一个基于 Levenshtein 构建的类似 SequenceMatcher 的示例类。它缺少一些 SequenceMatcher 的功能,但又有一些额外的功能。Levenshtein.c 也可以用作纯 C 库。您只需在编译时定义 NO_PYTHON 预处理器符号 (-DNO_PYTH

    基于OpenCV像素检测的Onmyoji游戏脚本

    基于OpenCV像素检测的Onmyoji游戏脚本

    机器人算法的 Python 示例代码 .zip

    Pythonbot高斯网格图射线投射网格图激光雷达至网格地图k-均值对象聚类矩形接头大满贯迭代最近点 (ICP) 匹配FastSLAM 1.0路径规划动态窗口方法基于网格的搜索Dijkstra 算法A* 算法D*算法D* Lite 算法位场算法基于网格的覆盖路径规划国家网格规划偏极采样车道采样概率路线图(PRM)规划快速探索随机树(RRT)回程时间*RRT* 和 reeds-shepp 路径LQR-RRT*五次多项式规划Reeds Shepp 规划基于LQR的路径规划Frenet 框架中的最佳轨迹路径追踪移动到姿势控制斯坦利控制后轮反馈控制线性二次调节器 (LQR) 速度和转向控制模型预测速度和转向控制采用 C-GMRES 的非线性模型预测控制手臂导航N关节臂对点控制带避障功能的手臂导航航空导航无人机三维轨迹跟踪火箭动力着陆双足动物倒立摆双

    可信任的企业4.0生态系统.pptx

    可信任的企业4.0生态系统.pptx

    C语言档案管理系统 代码完整

    学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,系统提供菜单方式作为人机界面并具有如下功能: 学生信息录入功能 学生信息浏览功能 按学号、姓名等进行查询、排序功能 2、要求界面简单明了;对输入的数据具有有效性检查能力,比如输入的成绩不在0~100之间,要求重新输入;

    原生js谷歌网页电吉他弹奏源码.rar

    原生js谷歌网页电吉他弹奏源码.rar

    原生js微信分享到朋友圈浮动层代码.zip

    原生js微信分享到朋友圈浮动层代码.zip

    第7章 聚类算法 - 作业 - 副本.ipynb

    第7章 聚类算法 - 作业 - 副本.ipynb

    AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集(30份).zip

    AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集,共30份。 AI辅助编程测评与企业实践 SmartEV和AI 蔚来的思考与实践 下一代 RAG 引擎的技术挑战与实现 书生万象大模型的技术演进与应用探索 人工智能行业数据集构建及模型训练方法实践周华 全方位评测神经网络模型的基础能力 千亿参数 LLM 的训练效率优化 向量化与文档解析技术加速大模型RAG应用落地 基于大模型的缺陷静态检查 多环境下的 LLM Agent 应用与增强 大模型在华为推荐场景中的探索和应用 大模型在推荐系统中的落地实践 大模型的异构计算和加速 大模型辅助需求代码开发 大语言模型在法律领域的应用探索 大语言模型在计算机视觉领域的应用 大语言模型的幻觉检测 小米大模型端侧部署落地探索 快手可图大模型的技术演进与应用探索 提升大模型知识密度,做高效的终端智能 电商大模型及搜索应用实践 百度大模型 原生安全构建之路 硅基流动高性能低成本的大模型推理云实践 语言模型驱动的软件工具思考:可解释与可溯源 长文本大模型推理实践:以 KVCache 为中心的分离式推理架构 阿里云 AI 搜索 RAG 大模型优

Global site tag (gtag.js) - Google Analytics