viewPager是v4包里的一个组件,可以实现滑动显示多个界面。

android也为viewPager提供了一个adapter,此adapter最少要重写4个方法:

public int getCount()

public boolean isViewFromObject(View view, Object o)

public void destroyItem(ViewGroup container, int position, Object object)

   public Object instantiateItem(ViewGroup container, int position)

这些方法的作用我就不说了,在代码里面有详细的解释。

接下来就直接上代码吧!!

MainActivity.java

 package com.example.administrator.viewpagerdemo;

 import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TabHost;
import android.widget.TabWidget; import java.util.ArrayList;
import java.util.List; public class MainActivity extends Activity { private ViewPager viewPager = null;
private List<View> viewContainter = new ArrayList<View>(); //存放容器
private ViewPagerAdapter viewPagerAdapter = null; //声明适配器 private TabHost mTabHost = null;
private TabWidget mTabWidget = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initMyTabHost(); //初始化TabHost
// 绑定组件
viewPager = (ViewPager) findViewById(R.id.viewpager);
initViewPagerContainter(); //初始viewPager
viewPagerAdapter = new ViewPagerAdapter();
//设置adapter的适配器
viewPager.setAdapter(viewPagerAdapter);
//设置viewPager的监听器
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
//当 滑动 切换时
@Override
public void onPageSelected(int position) {
mTabWidget.setCurrentTab(position);
}
@Override
public void onPageScrollStateChanged(int state) { }
});
//TabHost的监听事件
mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
if(tabId.equals("tab1")){
viewPager.setCurrentItem(0);
}else if (tabId.equals("tab2")){
viewPager.setCurrentItem(1);
}else if (tabId.equals("tab3")){
viewPager.setCurrentItem(2);
}else{
viewPager.setCurrentItem(3);
}
}
}); //解决开始时不显示viewPager
mTabHost.setCurrentTab(1);
mTabHost.setCurrentTab(0);
} //初始化TabHost
public void initMyTabHost(){
//绑定id
mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();
mTabWidget = mTabHost.getTabWidget();
/**
* newTabSpec() 就是给每个Tab设置一个ID
* setIndicator() 每个Tab的标题
* setCount() 每个Tab的标签页布局
*/
mTabHost.addTab(mTabHost.newTabSpec("tab1").setContent(R.id.tab1).setIndicator("第一页"));
mTabHost.addTab(mTabHost.newTabSpec("tab2").setContent(R.id.tab2).setIndicator("第二页"));
mTabHost.addTab(mTabHost.newTabSpec("tab3").setContent(R.id.tab3).setIndicator("第三页"));
mTabHost.addTab(mTabHost.newTabSpec("tab4").setContent(R.id.tab4).setIndicator("第四页"));
} //初始化viewPager
public void initViewPagerContainter(){
//建立四个view的样式,并找到他们
View view_1 = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewpager_view_1,null);
View view_2 = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewpager_view_2,null);
View view_3 = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewpager_view_3,null);
View view_4 = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewpager_view_4,null);
//加入ViewPage的容器
viewContainter.add(view_1);
viewContainter.add(view_2);
viewContainter.add(view_3);
viewContainter.add(view_4);
} //内部类实现viewpager的适配器
private class ViewPagerAdapter extends PagerAdapter{ //该方法 决定 并 返回 viewpager中组件的数量
@Override
public int getCount() {
return viewContainter.size();
} @Override
public boolean isViewFromObject(View view, Object o) {
return view == o;
}
//滑动切换的时候,消除当前组件
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewContainter.get(position));
}
//每次滑动的时候生成的组件
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewContainter.get(position));
return viewContainter.get(position);
}
}
}

activity_main.xml

在使用TabHost和TabWidget时,指定他们的id时时,android的已经为他定义好了,并且必须为他们指定这个id。而且TabHost里面必须要包含TabWedght和FrameLayout

切他们的id也必须为android已经给定的,就是下面xml代码里的id,否则会报错

<TabHost
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"
android:id="@android:id/tabhost">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/red"
android:layout_weight="9">
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
<TextView
android:id="@+id/tab1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tab2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tab3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tab4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout> </LinearLayout>
</TabHost>

我们再为viewPager添加View的时候,需要建立他们的布局文件,在上面的代码,我建立了4个xml,内容是一样的,都放了一个ImageView

<TabHost
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"
android:id="@android:id/tabhost">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/red"
android:layout_weight="9">
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
<TextView
android:id="@+id/tab1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tab2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tab3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tab4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout> </LinearLayout>
</TabHost>

     这样做出来的Demo,首次启动时会出现无法显示画面的问题,只有当点击一次Tab的时候才会显示。为了解决这个问题,我在MainActivity的onCreate()方法的

最后面加入了这两句话,但是还是不明白,为什么我只 mTabHost.setCurrentTab(0);不起作用,希望知道的的小伙伴各异给我解答一下疑惑,谢谢。

//解决开始时不显示viewPager
mTabHost.setCurrentTab(1);
mTabHost.setCurrentTab(0);

下面是效果图:

Android:简单实现ViewPager+TabHost+TabWidget实现导航栏导航和滑动切换的更多相关文章

  1. iOS导航栏-导航栏透明

    设置一张透明图片:nav_bargound.png  //导航栏背景     [self.navigationController.navigationBar setBackgroundImage:[ ...

  2. MTK Android SwitchPreference(设置-智能辅助-导航栏-导航栏可隐藏)

    1.界面布局文件 packages/apps/PrizeSettings/res/xml/navigation_bar_prize.xml ------------------------------ ...

  3. swift导航栏导航按钮添加多个按钮事件

    //导航左边返回按钮 let button1 = UIButton(frame:CGRectMake(0, 0, 18, 18)) button1.setImage(Constant.Image.Na ...

  4. Android中使用ViewPager实现屏幕页面切换和页面切换效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpag ...

  5. Android ScrollView嵌套ViewPager,嵌套的ViewPager无法显示

    记录:ScrollView嵌套ViewPager,嵌套的ViewPager无法显示 项目中所需要布局:LinearLayout中包含(orientation="vertical") ...

  6. iOS系统中导航栏的转场解决方案与最佳实践

    背景 目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美.有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们 ...

  7. 03 uniapp自定义导航栏的开发

    在我眼里自定义导航分2类: 原生基础上 || 非原生基础上 总结:项目当中能原生就原生,提高性能 区别 uni-app 自带原生导航栏,在pages.json里配置. 原生导航的体验更好,渲染新页面时 ...

  8. Bootstrap<基础十七>导航栏

    导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点.导航栏在您的应用或网站中作为导航页头的响应式基础组件.导航栏在移动设备的视图中是折叠的,随着可用视口宽度的增加,导航栏也会水平展开. ...

  9. BootStrap导航栏的使用

    默认的导航栏 创建一个默认的导航栏的步骤如下: 向 <nav> 标签添加 class .navbar..navbar-default. 向上面的元素添加 role="naviga ...

随机推荐

  1. Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (1)

    Swiftsuspenders2 是一个基于元数据(metadata)的IOC(控制反转,inversion of control)的AS3的解决方案.反转控制又被称依赖注射(Dependency I ...

  2. oracle 闪回技术

    oracle默认不启动闪回数据库 如果需要启动闪回数据库,数据库需要设置为归档模式,并启用恢复区. 1.查看是否启动闪回删除 SQL> show parameter recyclebin; NA ...

  3. Andriod基础——Adapter类

    Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View,因为layout五花八门,很多数据都不能直接绑定上去,所以Android引入了Adapte ...

  4. TCP/IP详解学习笔记(14)-- TCP可靠传输的实现

    1.概述      为方便描述可靠传输原理,假定数据传输只在一个方向上进行,即A发送数据,B给出确认 2.以字节为单位的滑动窗口      TCP的滑动窗口是以字节为单位的.为了便于说明,字节编号取得 ...

  5. NSString常见用法总结

    //====================NSStirng 的常见用法==================== -(void)testString { //创建格式化字符串:占位符(由一个%加一个字 ...

  6. WP8_检测列表是否滑动

    One of the UI features of lists on Windows Phone 7 is that the "scroll bars" don't really ...

  7. 【.NET】单例模式标准写法

    public sealed class Singleton { private static Singleton instance = null; static readonly object pad ...

  8. Linux:一台apache服务器上部署多个项目的apache配置

    第一步: 将代码取到/var/www/html目录下(此为默认目录,具体看apache的设置):该目录下可以放多个项目,如: [root@www html]# pwd/var/www/html[roo ...

  9. JavaScript探秘系列

    此文章所在专题列表如下: 我们应该如何去了解JavaScript引擎的工作原理 JavaScript探秘:编写可维护的代码的重要性 JavaScript探秘:谨慎使用全局变量 JavaScript探秘 ...

  10. CSS3 图片悬浮缩放效果

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...