TabPagerIndicator和viewpager实现tab的切换(慕课网笔记)

使用第三方的TabPageIndicator,viewpager,fragment,fragmentPagerAdapter实现顶部tab 导航栏的切换,效果图
这里写图片描述
1 顶部是一个布局文件,top.xml,中间的tab切换是一个TabPageIndicator,下面的内容区域是viewpager
准备文件:本文引用了第三方的库文件:ViewPagerIndicator。引入方法如下:
(1) github上搜索viewpagerIndicator: https://github.com/JakeWharton/ViewPagerIndicator
(2) 下载zip包,解压,在eclipse中选择File->import->Existing Android Code Into Workspace->(注意只导入解压后文件夹里面的Library)。此处需要注意的是我们下载解压后的文件夹的放置路径最好和主项目路径一致,路径中尽量不要包含中文字符。
(3) 导入后,右键导入的文件夹的目录选择Property->Android->勾选IsLibrary
(4)将导入的library文件夹下面的libs下的support-v4的jar包copy到主项目文件下的libs文件夹,覆盖现有的v4包,否则会报version mismatch
(6)右键主项目,property->Android->AddLibrary添加进来
(7) ctrl+shift+T试着将TabPageIndicator的class搜索出来,说明项目已经成功导入
2 布局文件
2.1 顶部布局的实现top.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="wrap_content"
    android:gravity="center_vertical"
    android:background="#58ACED"
    android:orientation="horizontal" >
    <ImageView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/idx_logo"/>
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="imooc"
        android:textColor="#ffffff"
        android:textStyle="bold"
        android:textSize="20sp"
        android:layout_marginLeft="5dp"/>

</LinearLayout>

2.2 viewpager上面显示的内容用Fragment实现,其对应的布局文件为frag.xml,在这个例子中我们统一用一个简单的布局文件frag.xml来显示内容区域。实际应用中一般都是设置多个Fragment,然后添加到list中,可参考http://blog.csdn.net/hnyzwtf/article/details/50296013

<?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="match_parent"
     >
    <TextView
        android:id="@+id/id_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="helloworld"
        android:textSize="20sp"
        android:layout_centerInParent="true"/>

</RelativeLayout>

2.3 主布局的实现activity_main.xml。在主布局中包含上述的top.xml和一个TabPageIndicator指示器用来显示切换不同的tab选项,一个viewpager用来显示内容区域。

<LinearLayout 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:orientation="vertical">

   <include layout="@layout/top"/>
   <com.viewpagerindicator.TabPageIndicator
        android:id="@+id/id_indicator"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent">

    </com.viewpagerindicator.TabPageIndicator>
    <android.support.v4.view.ViewPager 
        android:id="@+id/id_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>
</LinearLayout>

效果:
这里写图片描述
3 代码的实现
3.1 新建一个Fragment,即viewpager的数据源,也就是点击每个tab后显示的内容区域TabFragment.java继承自Fragment

package com.example.imooc_tab04;

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

//此类也是viewpager设置的适配器的数据源
public class TabFragment extends Fragment {
    private int position;
    public TabFragment(int position) {
        this.position = position;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frag, container, false);//引入对应的布局文件frag.xml
        TextView tv = (TextView) view.findViewById(R.id.id_tv);
        //设置一个位置变量,每次点击tab传入不同的tab位置以便textview上显示相应的标题
        tv.setText(TabAdapter.TITLES[position]);
        return view;
    }

}

3.2 新建一个viewpager的适配器TabAdapter.java继承自FragmentPagerAdapter

package com.example.imooc_tab04;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

/*
 * viewpager的适配器
 * */
public class TabAdapter extends FragmentPagerAdapter {
    //定义显示在主界面5个tab上面的标题文字
    public static String[] TITLES = new String[]{"课程","问答","求课","学习","计划"};

    public TabAdapter(FragmentManager fm) {
        super(fm);

    }

    @Override
    public Fragment getItem(int arg0) {
        TabFragment fragment = new TabFragment(arg0);
        return fragment;
    }

    @Override
    public int getCount() {

        return TITLES.length;//返回标题,tab的个数
    }

    @Override
    public CharSequence getPageTitle(int position) {

        return TITLES[position];//返回不同的title标题
    }

}

3.3 MainActivity.java

package com.example.imooc_tab04;

import com.viewpagerindicator.TabPageIndicator;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;

public class MainActivity extends FragmentActivity {
    private ViewPager mViewPager;
    private TabPageIndicator mTabPagerIndicator;//引入的第三方的library
    private TabAdapter mAdapter;//适配器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {//初始化view
        mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
        mTabPagerIndicator = (TabPageIndicator) findViewById(R.id.id_indicator);
        mAdapter = new TabAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(mAdapter);//viewpager设置适配器
        mTabPagerIndicator.setViewPager(mViewPager, 0);//为切换tab功能的indicator设置viewpager

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

4 修改一下样式,vaules下的styles.xml中添加以下我们自定义的样式:MyAppTheme

<style name="MyAppTheme" parent="AppBaseTheme">
        <item name="vpiTabPageIndicatorStyle">@style/MyWidget.TabPageIndicator</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:animationDuration">5000</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

    <style name="MyWidget.TabPageIndicator" parent="Widget">
        <item name="android:gravity">center</item>
        <item name="android:background">@drawable/vpi__tab_indicator</item>
        <item name="android:paddingLeft">22dip</item>
        <item name="android:paddingRight">22dip</item>
        <item name="android:paddingTop">8dp</item>
        <item name="android:paddingBottom">8dp</item>
        <item name="android:textAppearance">@style/MyTextAppearance.TabPageIndicator</item>
        <item name="android:textSize">16sp</item>
        <item name="android:maxLines">1</item>
    </style>

    <style name="MyTextAppearance.TabPageIndicator" parent="Widget">
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">@android:color/black</item>
    </style>

5 在AndroidManifest中引用MyAppTheme即可

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        **android:theme="@style/MyAppTheme"** >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

源码在这里:http://download.csdn.net/detail/hnyzwtf/9362207

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以为您提供一段实现android tablelayout和viewpager切换页面的代码: 1. 首先在XML文件中添加TableLayout和ViewPager: ``` <TableLayout android:layout_width="match_parent" android:layout_height="match_parent" android:stretchColumns="*"> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"> <TextView android:id="@+id/tab1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:padding="10dp" android:text="Tab 1" /> <TextView android:id="@+id/tab2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:padding="10dp" android:text="Tab 2" /> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content"> <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_span="2" /> </TableRow> </TableLayout> ``` 2. 在Java文件中,创建一个适配器以配置ViewPager: ``` public class MyPagerAdapter extends FragmentPagerAdapter { private static final int NUM_PAGES = 2; public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new Tab1Fragment(); case 1: return new Tab2Fragment(); default: return null; } } @Override public int getCount() { return NUM_PAGES; } } ``` 3. 创建两个Fragment来显示不同的页面内容: ``` public class Tab1Fragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab1_layout, container, false); return view; } } public class Tab2Fragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab2_layout, container, false); return view; } } ``` 4. 在MainActivity中配置ViewPager和TabLayout: ``` public class MainActivity extends AppCompatActivity { private ViewPager mViewPager; private TabLayout mTabLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = findViewById(R.id.view_pager); mTabLayout = findViewById(R.id.tab_layout); mTabLayout.addTab(mTabLayout.newTab().setText("Tab 1")); mTabLayout.addTab(mTabLayout.newTab().setText("Tab 2")); final MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(adapter); mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { mViewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } } ``` 以上就是实现android tablelayout和viewpager切换页面的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值