Android:简单实现ViewPager+TabHost+TabWidget实现导航栏导航和滑动切换

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

  1 package com.example.administrator.viewpagerdemo;
  2
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.support.v4.view.PagerAdapter;
  6 import android.support.v4.view.ViewPager;
  7 import android.view.LayoutInflater;
  8 import android.view.View;
  9 import android.view.ViewGroup;
 10 import android.widget.TabHost;
 11 import android.widget.TabWidget;
 12
 13 import java.util.ArrayList;
 14 import java.util.List;
 15
 16
 17 public class MainActivity extends Activity {
 18
 19     private ViewPager viewPager = null;
 20     private List<View> viewContainter = new ArrayList<View>();   //存放容器
 21     private ViewPagerAdapter viewPagerAdapter = null;   //声明适配器
 22
 23     private TabHost mTabHost = null;
 24     private TabWidget mTabWidget = null;
 25
 26     @Override
 27     protected void onCreate(Bundle savedInstanceState) {
 28         super.onCreate(savedInstanceState);
 29         setContentView(R.layout.activity_main);
 30         initMyTabHost();  //初始化TabHost
 31         // 绑定组件
 32         viewPager = (ViewPager) findViewById(R.id.viewpager);
 33         initViewPagerContainter();  //初始viewPager
 34         viewPagerAdapter = new ViewPagerAdapter();
 35         //设置adapter的适配器
 36         viewPager.setAdapter(viewPagerAdapter);
 37         //设置viewPager的监听器
 38         viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
 39             @Override
 40             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 41
 42             }
 43             //当 滑动 切换时
 44             @Override
 45             public void onPageSelected(int position) {
 46                 mTabWidget.setCurrentTab(position);
 47             }
 48             @Override
 49             public void onPageScrollStateChanged(int state) {
 50
 51             }
 52         });
 53         //TabHost的监听事件
 54         mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
 55             @Override
 56             public void onTabChanged(String tabId) {
 57                 if(tabId.equals("tab1")){
 58                     viewPager.setCurrentItem(0);
 59                 }else if (tabId.equals("tab2")){
 60                     viewPager.setCurrentItem(1);
 61                 }else if (tabId.equals("tab3")){
 62                     viewPager.setCurrentItem(2);
 63                 }else{
 64                     viewPager.setCurrentItem(3);
 65                 }
 66             }
 67         });
 68
 69         //解决开始时不显示viewPager
 70         mTabHost.setCurrentTab(1);
 71         mTabHost.setCurrentTab(0);
 72     }
 73
 74     //初始化TabHost
 75     public void initMyTabHost(){
 76         //绑定id
 77         mTabHost = (TabHost) findViewById(android.R.id.tabhost);
 78         mTabHost.setup();
 79         mTabWidget = mTabHost.getTabWidget();
 80         /**
 81          * newTabSpec()   就是给每个Tab设置一个ID
 82          * setIndicator()   每个Tab的标题
 83          * setCount()       每个Tab的标签页布局
 84          */
 85         mTabHost.addTab(mTabHost.newTabSpec("tab1").setContent(R.id.tab1).setIndicator("第一页"));
 86         mTabHost.addTab(mTabHost.newTabSpec("tab2").setContent(R.id.tab2).setIndicator("第二页"));
 87         mTabHost.addTab(mTabHost.newTabSpec("tab3").setContent(R.id.tab3).setIndicator("第三页"));
 88         mTabHost.addTab(mTabHost.newTabSpec("tab4").setContent(R.id.tab4).setIndicator("第四页"));
 89     }
 90
 91     //初始化viewPager
 92     public void initViewPagerContainter(){
 93         //建立四个view的样式,并找到他们
 94         View view_1 = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewpager_view_1,null);
 95         View view_2 = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewpager_view_2,null);
 96         View view_3 = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewpager_view_3,null);
 97         View view_4 = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewpager_view_4,null);
 98         //加入ViewPage的容器
 99         viewContainter.add(view_1);
100         viewContainter.add(view_2);
101         viewContainter.add(view_3);
102         viewContainter.add(view_4);
103     }
104
105     //内部类实现viewpager的适配器
106     private class ViewPagerAdapter extends PagerAdapter{
107
108         //该方法 决定 并 返回 viewpager中组件的数量
109         @Override
110         public int getCount() {
111             return viewContainter.size();
112         }
113
114         @Override
115         public boolean isViewFromObject(View view, Object o) {
116             return view == o;
117         }
118         //滑动切换的时候,消除当前组件
119         @Override
120         public void destroyItem(ViewGroup container, int position, Object object) {
121             container.removeView(viewContainter.get(position));
122         }
123         //每次滑动的时候生成的组件
124         @Override
125         public Object instantiateItem(ViewGroup container, int position) {
126             container.addView(viewContainter.get(position));
127             return viewContainter.get(position);
128         }
129     }
130 }

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);

下面是效果图:

时间: 2024-10-13 20:48:45

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

习题 导航栏 选项卡 图片左右切换

导航栏 1.函数 字符串函数 var s=new string(); var ss="hello world"; var sss=""HELLO, WORLD"; alert(ss.toLowerCase());--转换成小写 alert(sss.toUpperCase());--转换成大写 alert(ss.substr(2,3));--截取字符串,从索引2开始,截取3个字符长度,不写后面的数字是截到最后 alert(ss.substring(2,3))

iOS导航栏-导航栏透明

设置一张透明图片:nav_bargound.png //导航栏背景    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bargound.png"] forBarMetrics:UIBarMetricsDefault];        //导航栏底部线    self.navigationController.navigationBar.shadowImage 

Android简单的ViewPager指示器

平常写项目在写介绍页,或者一些简单的轮播图的时候,总会需要搭配指示器来标明当前在什么位置.写法也比较多,刚好自己需要用到,以前用的一些方法,用起来需要配置好多东西,有些大材小用,所以来简单的实现一个.效果图如下: 一.简单分析与代码实现 因为比较简单,所以就简单的分析一下: 1)每一个指示器项有两种状态,普通状态和选中状态,所以需要准备两种状态的图片. 2)指示器的个数和ViewPager的页数要保持一致.可以引用ViewPager对象,来获取ViewPager的页数.从而创建指示器. 3)指示

搜索框,导航栏随页面滑动渐变

简单的变化 #pragma mark - scrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat alpha = scrollView.contentOffset.y / 100; if (alpha >= 1) { alpha = 1; }else if (alpha <= 0) { alpha = 0; } self.naviView.backgroundColor = [UIc

Android开发——实现TabHost 随手滑动切换选项卡功能(绝对实用)

以前用TabHost只是点击导航栏选项卡才进行切换,今天试了下手势滑动进行切换,搜了好多资料感觉特别乱,花了好长时间整理了一下终于有效果了,自己写了一个Demo. 程序清单1:布局文件 说明:和我们写Tabhost布局文件一样 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout  xmlns:android="http://schemas.andro

Bootstrap&lt;基础十七&gt;导航栏

导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点.导航栏在您的应用或网站中作为导航页头的响应式基础组件.导航栏在移动设备的视图中是折叠的,随着可用视口宽度的增加,导航栏也会水平展开.在 Bootstrap 导航栏的核心中,导航栏包括了站点名称和基本的导航定义样式. 默认的导航栏 创建一个默认的导航栏的步骤如下: 向 <nav> 标签添加 class .navbar..navbar-default. 向上面的元素添加 role="navigation",有助

Bootstrap导航栏实例讲解

导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点.导航栏是响应式元组件就,作为应用程序或网站的导航标题.导航栏在移动设备的视图中是折叠的,随着可用视口宽度的增加,导航栏也会水平展开.在 Bootstrap 导航栏的核心中,导航栏包括了为站点名称和基本的导航定义样式. 1.默认的导航栏创建一个默认的导航栏的步骤如下: 向 <nav> 标签添加 class .navbar..navbar-default(白底黑字),navbar-inverse(黑底白字) 向上面的元素添加 ro

03-Flutter移动电商实战-底部导航栏制作

1.cupertino_IOS风格介绍 在Flutter里是有两种内置风格的: material风格: Material Design 是由 Google 推出的全新设计语言,这种设计语言是为手机.平板电脑.台式机和其他平台提供一致,更广泛的外观和感觉.我喜欢称它为纸墨设计.Material Design 风格是一种非常有质感的设计风格,并会提供一些默认的交互动画. cupertino风格:即 IOS 风格组件,它重现了很多经典的有 IOS 特性的交互和界面风格,让适用于 IOS 的人感觉亲切和

&lt;iOS 导航栏&gt;第一节:导航栏透明方法实现代码

说下导航栏的透明方法: 很多应用需要导航栏随着向上滑动,逐渐从透明变成不透明,很炫酷,大部分应用都在使用导航栏渐变效果,现附上代码然后直接将实现,一会讲下如何来实现,这一部分直接上代码. 先附上代码: 方法声明: #import <UIKit/UIKit.h> @interface IDSNavBarView : UIView - (instancetype)initWithFrame:(CGRect)frame titleImg:(UIImage *)aTitleImg; - (UILabe