`
men4661273
  • 浏览: 277933 次
  • 性别: 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
分享到:
评论

相关推荐

    fragment+Viewpager 嵌套

    2:fragment+viewpager 通过对滑动事件的监听、切换视图 3:在2的基础上,进行viewpager嵌套。 并获取不同的监听事件 4:在3的基础上,自定义listview 并获取相应的监听事件 (PS:更大层面上适合初学者学习和了解...

    RadioGroup+Fragment+ViewPager导航,指示器动画效果

    总之,`RadioGroup+Fragment+ViewPager`的组合是Android开发中实现导航和多页面切换的一种常见方式,配合动态指示器动画,可以创建出优雅且互动性强的用户界面。通过深入研究和实践,开发者可以熟练掌握这一技术,...

    Fragment+ViewPager实现底部导航栏

    在Android应用开发中,创建一个具有底部导航栏的界面是一个常见的需求。底部导航栏通常用于在多个主要功能间切换,给用户提供直观的操作入口。在这个场景中,我们将利用`Fragment`、`ViewPager`以及单选按钮...

    Fragment+ViewPager标准导航

    在导航界面中,每个导航选项通常对应一个`Fragment`,展示不同的内容。 `ViewPager`是Android Support库中的一个组件,主要用于展示可以左右滑动的页面集合。它非常适合用来实现滑动切换的效果,用户可以通过手势...

    fragment+viewpager的使用

    总结一下,`Fragment+ViewPager`的组合提供了强大的动态界面设计能力,结合`RadioButton`可以实现模块化的内容展示。通过创建`Fragment`子类,设置`PagerAdapter`,以及处理`RadioButton`的点击事件,我们可以轻松地...

    Viewpager+Fragment+RadioButton

    在Android开发中,`ViewPager`、`Fragment`和`RadioButton`是常见的组件,它们结合使用可以构建出功能丰富的用户界面,尤其是对于展示多个相互关联的屏幕或者内容切换场景非常适用。下面将详细介绍这三个组件以及...

    RadioButton+ViewPager+Fragment

    在Android开发中,`RadioButton`、`ViewPager`和`Fragment`是常见的组件,它们结合使用可以构建出功能丰富的用户界面,尤其是用于实现标签页(Tab)功能。下面将详细讲解这三个组件以及它们如何协同工作。 `...

    自定义HorizontalScrollView模仿RadioGroup+Fragment+ViewPager的翻页与点击效果,效果完全一样.161124更新

    在Android开发中,有时我们需要实现类似RadioGroup与Fragment或ViewPager结合的翻页和点击效果,以提供用户友好的界面交互。这个"自定义HorizontalScrollView模仿RadioGroup+Fragment+ViewPager的翻页与点击效果...

    自定义HorizontalScrollView模仿RadioGroup+Fragment+Viewpager的翻页与点击效果,效果完全一样

    在Android开发中,有时我们需要实现一个可滑动切换的页面组件,这通常涉及到HorizontalScrollView、RadioGroup、Fragment以及ViewPager等控件。标题提到的“自定义HorizontalScrollView模仿RadioGroup+Fragment+...

    ViewPager+Fragment+RadioGroup导航

    `ViewPager`用于实现页面滑动效果,`Fragment`代表应用界面的一部分,而`RadioGroup`则是一个用于管理单选按钮的容器。下面我们将深入探讨这三个组件以及如何将它们结合使用来创建导航样式。 `ViewPager`是Android ...

    RadioGroup+ViewPager制作的底部导航栏

    在Android应用开发中,底部导航栏(Bottom Navigation)是一种常见的用户界面设计,它允许用户在应用的多个顶级功能之间快速切换。本教程将探讨如何利用`RadioGroup`和`ViewPager`来实现这样一个功能丰富的底部导航...

    [有源码]ViewPager+Fragment+RadioButton替代TabActivity

    【有源码】ViewPager+Fragment+RadioButton替代TabActivity 在Android开发中,传统的TabActivity已经被弃用,取而代之的是更加灵活、可定制化的组件组合。本项目中,使用ViewPager、Fragment和RadioButton来实现...

    fragement+viewpager+radiobutton深度理解androidstudio,用完请好评!

    在Android开发中,Fragment、ViewPager和RadioButton是三个非常重要的组件,它们在构建用户界面和实现交互功能时起着关键作用。下面将详细讲解这些组件的工作原理以及如何在Android Studio中进行深度集成和使用。 ...

    安卓:ViewPager+Fragment+RadioButton实现底部菜单栏滑动切换

    ViewPager就是一个简单的页面切换组件,我们可以往里面填充多个View,然后我们可以左右滑动,从而切换不同的View,我们可以通过setPageTransformer()方法为我们的ViewPager&gt; 设置切换时的动画效果。和ListView,...

    RadioButton+ViewPager 底部栏

    在Android应用开发中,"RadioButton+ViewPager 底部栏"是一种常见的设计模式,用于实现底部导航功能。这种设计使得用户可以方便地在多个视图之间切换,而RadioButton通常被用作选择器,显示当前选中的页面。下面我们...

    Android软件架构之RadioGroup + Fragment , TabLayout + ViewPager +Fragment

    本主题主要探讨的是一个常见的Android软件架构设计,它结合了RadioGroup、Fragment、TabLayout和ViewPager组件,以实现类似今日头条等主流应用的界面和交互效果。这个架构模式在商业软件中广泛应用,因为它提供了...

    框架(ViewPager+RadioButton+Fragment)

    总结来说,"框架(ViewPager+RadioButton+Fragment)"是Android开发中一种实用的布局策略,它提供了一个高效的用户界面设计,用于构建多页滑动应用,并且具有良好的可扩展性和用户体验。理解并熟练掌握这种框架对于...

    使用Tablayout和RadioGroup实现底部导航

    在Android应用开发中,底部导航(Bottom Navigation)是一种常见的用户界面设计模式,它允许用户在三个到五个主要功能之间快速切换。在这个场景中,我们将探讨如何利用`TabLayout`和`RadioGroup`来实现这样的功能。 ...

    fragmnet+viewPager+RadioGroup底部导航栏

    在底部导航栏中,RadioGroup用于展示各个Tab,用户点击其中一个,相应的RadioButton会被选中,同时ViewPager会切换到对应的Fragment。 构建底部导航栏的步骤如下: 1. **布局设计**:首先在XML布局文件中创建一个...

    ViewPager+Fragment+RadioGroup 实现仿微信界面

    4. **监听RadioGroup**: 设置RadioGroup的`OnCheckedChangeListener`,当用户点击RadioButton时,根据选中的按钮索引更新ViewPager当前显示的Fragment。这可以通过调用ViewPager的`setCurrentItem()`方法完成。 5. ...

Global site tag (gtag.js) - Google Analytics