Android多画面幻灯片:ViewPager基础上,利用与PagerTabStrip出生缺陷(源代码)
近期使用ViewPager。读了几个人说是不是很清晰的信息,干脆自己写demo总结下。
样例非常easy。Activity里有三个界面能够滑动。每个界面都有一个button并设置好了监听。PagerTabStrip也就是滑动时的那个标识线。在View的下方。下为代码:
activity_main.xml(主布局)
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true" > <android.support.v4.view.PagerTabStrip
android:id="@+id/pagertab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"/>
</android.support.v4.view.ViewPager> </RelativeLayout>
以下是三个view布局,都差点儿相同:
first_pager_layout.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="match_parent"
android:orientation="vertical"
android:background="@android:color/holo_blue_bright"> <Button
android:id="@+id/btn_in_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请点击"
android:layout_gravity="center"/>
</LinearLayout>
second_pager_layout.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="match_parent"
android:orientation="vertical"
android:background="@android:color/holo_green_light">
<Button
android:id="@+id/btn_in_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请点击"
android:layout_gravity="center"/> </LinearLayout>
third_pager_layout.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="match_parent"
android:orientation="vertical"
android:background="@android:color/holo_red_light"> <Button
android:id="@+id/btn_in_third"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请点击"
android:layout_gravity="center"/>
</LinearLayout>
MainActivity.java(这是主程序里。在里面实例化ViewPager并设置它的适配器)
package org.yanzi.testviewpager1; import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity { List<View> mViews = new ArrayList<View>();
String[] mTitles = {"页面1", "页面2", "页面3"};
MyPagerAdapter pagerAdapter;
PagerTabStrip pagerTabStrip;
PagerTitleStrip pagerTitleStrip;
ViewPager viewPager;
View view1, view2, view3;
Button btn1, btn2, btn3;
BtnListener btnListener; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
LayoutInflater flater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view1 = flater.inflate(R.layout.first_pager_layout, null);
view2 = flater.inflate(R.layout.second_pager_layout, null);
view3 = flater.inflate(R.layout.third_pager_layout, null);
mViews.add(view1);
mViews.add(view2);
mViews.add(view3);
pagerAdapter = new MyPagerAdapter(mViews, mTitles);
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(1); //设置pagerTabStrip
pagerTabStrip.setTabIndicatorColor(Color.RED);
pagerTabStrip.setTextColor(Color.RED);
pagerTabStrip.setClickable(false);
pagerTabStrip.setTextSpacing(40);
pagerTabStrip.setBackgroundColor(Color.GRAY);
pagerTabStrip.setDrawFullUnderline(true);
/* pagerTitleStrip.setTextColor(Color.RED);
pagerTitleStrip.setTextSpacing(40);*/ //ViewPager滑动监听
viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
showToast("切换至:" + mTitles[arg0]);
} @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub } @Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub }
}); initBtns(); } @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;
}
private void initUI(){
viewPager = (ViewPager)findViewById(R.id.viewpager);
pagerTabStrip = (PagerTabStrip)findViewById(R.id.pagertab);
// pagerTitleStrip = (PagerTitleStrip)findViewById(R.id.pagertab);
}
private void initBtns(){
if(view1 != null){
btn1 = (Button)view1.findViewById(R.id.btn_in_first); }
if(view2 != null){
btn2 = (Button)view2.findViewById(R.id.btn_in_second);
}
if(view3 != null){
btn3 = (Button)view3.findViewById(R.id.btn_in_third);
}
btnListener = new BtnListener(); btn1.setOnClickListener(btnListener);
btn2.setOnClickListener(btnListener);
btn3.setOnClickListener(btnListener);
}
class BtnListener implements View.OnClickListener{ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()){
case R.id.btn_in_first:
showToast("您点击了第一个界面");
break;
case R.id.btn_in_second:
showToast("您点击了第2个界面");
break;
case R.id.btn_in_third:
showToast("您点击了第3个界面");
break;
default:break;
}
} }
private void showToast(String s){
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
} }
MyPagerAdapter.java(这是ViewPager的适配器,继承PagerAdapter,将其单独写到一个文件中了)
package org.yanzi.testviewpager1; import java.util.List; import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup; public class MyPagerAdapter extends PagerAdapter {
private List<View> mListViews;
private String[] mTitles;
public MyPagerAdapter(List<View> views, String[] titles){
this.mListViews = views;
this.mTitles = titles;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mListViews.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return (arg0==arg1);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView(mListViews.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(mListViews.get(position), 0);
return mListViews.get(position);
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return mTitles[position];
} }
要点:
1、ViewPager说白了就是个控件,在使用时包名要带全是android.support.v4.view.ViewPager。
由于我的ADT-Bundle版本号比較高。这个包默认自带了,且默认是随apk打包导出的。
例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
假设在Android Private Libraries里没这个包,则要自己在属性的Libraries里自己加入。
加入后记得在上图所看到的的Order and Export里将其打勾。
2.理论上说要实现滑屏仅仅要一个ViewPager就能够了,不须要再在里面嵌套例如以下:
<android.support.v4.view.PagerTabStrip
android:id="@+id/pagertab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"/>
这个PagerTabStrip就是个横线,假设想用它来标识当前在哪个View的话能够加它,当然最后你会发现这就是个坑爹的玩意。
除了PagerTabStrip。另一个PagerTitleStrip,两者的使用方法地位都是一样的,均要嵌套在ViewPager里。差别是:
a、PagerTabStrip在效果上包括了PagerTitleStrip,假设仅仅加入PagerTabStrip能够看到仅仅有线,可是它占的布局是有一定高度的。
默认是不显示标题的,假设要显示需在适配器里重写:
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return mTitles[position];
}
就会显示标题了。关于标题及这个线的颜色,和整个标识View的背景能够再代码里设置。demo里有演示样例。
b、PagerTitleStrip仅仅显示标题而没有那个线。
c、PagerTabStrip能够点击切换View,而PagerTitleStrip不能点击。很多其它參见链接
两者相对父亲ViewPager的位置,也就是标识是在View的上面还是以下。通过PagerTabStrip的属性android:layout_gravity="bottom"来设置。
3、就像ListView的一样,ViewPager的关键在于适配器,而要用正常使用须要至少重写以下四个方法:
@Override
public int getCount() {
// TODO Auto-generated method stub
return mListViews.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return (arg0==arg1);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView(mListViews.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(mListViews.get(position), 0);
return mListViews.get(position);
}
以下这种方法是用来显示标题的,一般不重写,由于PagerTabStrip是个中看不中用的玩意。
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return mTitles[position];
}
4、在设置适配器后。通过viewPager.setCurrentItem(1);来设置默认的ViewPager显示哪一个View。
1标识第二个界面。
5、每个View里都用子控件。通过initBtns()来获得,注意findViewById时一定要前面加上它的父亲.例如以下:
btn1 = (Button)view1.findViewById(R.id.btn_in_first);更为严谨的做法是仅仅有显示当前View时,这个View里的控件才干够被监听。
6、当ViewPager的View发生变化时,设置监听:
//ViewPager滑动监听
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
showToast("切换至:" + mTitles[arg0]);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
7、PagerTabStrip里的非常多方法都是没有效果的如pagerTabStrip.setTextSpacing(40);
pagerTabStrip.setDrawFullUnderline(true);
以下是效果图:
能够看到显示页面3时,以下的PageTabStrip居然发生移位了,没人会须要这种体验,真是个坑爹的玩意啊。本来我还不死心想找到不自己写PageTabStrip情况下解决这个问题。看到链接 彻底放弃了。关于标识还是自己来写吧,兴许文章会再给出完整演示样例。
Android多画面幻灯片:ViewPager基础上,利用与PagerTabStrip出生缺陷(源代码)的更多相关文章
- Android 工程在4.0基础上混淆
Android现在对安全方面要求比较高了,我今天要做的对apk进行混淆,用所有的第三方工具都不能反编译,作者的知识产权得到保障了,是不是碉堡了. 一,首先说明我这是在4.0基础上进行的. 先看看pro ...
- 【转】Android 工程在4.0基础上混淆
Android现在对安全方面要求比较高了,我今天要做的对apk进行混淆,用所有的第三方工具都不能反编译,作者的知识产权得到保障了,是不是碉堡了. 一,首先说明我这是在4.0基础上进行的. 先看 ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
- 【Xamarin开发 Android 系列 6】 Android 结构基础(上)
原文:[Xamarin开发 Android 系列 6] Android 结构基础(上) 前面大家已经熟悉了什么是Android,而且在 [Xamarin开发 Android 系列 4] Android ...
- android、IOS和手机基础知识
一.手机基础知识 1.固件.刷固件.固件版本 固件是指固化的软件,英文为firmware,它是把某个系统程序写入到特定的硬件系统中的flashROM.手机固件相当于手机的系统,刷新固件就相当于刷系统. ...
- Android:简单实现ViewPager+TabHost+TabWidget实现导航栏导航和滑动切换
viewPager是v4包里的一个组件,可以实现滑动显示多个界面. android也为viewPager提供了一个adapter,此adapter最少要重写4个方法: public int getCo ...
- android控制文件:ViewPager+Fragment+GridView使用(与AndroidQuery框架结合)
最近我看到一个AndroidQuery该框架.里面Demo,有一个屏幕,让博主喜欢.很顺利的左右滑动,感觉非常好,所以拿来和大家分享一下.看看结果图.: 从图中能够看出.上面的布局是一个Layout里 ...
- Android开发实战之ViewPager实现向导界面
当我们更新应用,或者第一次进入应用时都会有一个向导界面,介绍这个app的内容和使用方式. 如果你细心你会发现其实这就是个viewpager,本篇博文将介绍应用的向导界面是如何制作的.希 望本篇博文对你 ...
- Android 画廊效果之ViewPager显示多个图片
首先来看下面的效果: 从上面的图片可以看到,当添加多张图片的时候,能够在下方形成一个画廊的效果,我们左右拉动图片来看我们添加进去的图片,效果是不是好了很多呢?下面来看看怎么实现吧! 上面的效果类似An ...
随机推荐
- 数据结构:循环队列(C语言实现)
生活中有非常多队列的影子,比方打饭排队,买火车票排队问题等,能够说与时间相关的问题,一般都会涉及到队列问题:从生活中,能够抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结 ...
- hdu 5045 Contest(状态压缩DP)
题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...
- 批处理删除IIS的everyone、users的访问权限
原文 批处理删除IIS的everyone.users的访问权限 以下批处理代码功能,实现的是,删除C盘的everyone.users用户对IIS的权限. 一.删除C盘的everyone的权限 cd/ ...
- php异或加密解密算法的实现
function xor_enc($str,$key) { $crytxt = ''; $keylen = strlen($key); for($i=0;$i<strlen($str);$i++ ...
- 如何生成可变表头的excel(转)
1.实现功能: 传入一个表头和数据,将数据导入到excel中. 为了便于项目的扩展,数据传入通过泛型集合传入,获取数据时,通过反射的方式获取,这样无论你的表头是多少项,我都能很方便的生成.另外为了便于 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----命令执行顺序控制与管道
介绍 顺序执行.选择执行.管道.cut 命令.grep 命令.wc 命令.sort 命令等,高效率使用 Linux 的技巧. 一.命令执行顺序的控制 1.顺序执行多条命令 通常情况下,我们每次只能在终 ...
- Lucene40PostingWriter
控制freq和prox这两个文件的输出,比较简单. 默认skip interval这是16,max skip level这是10. 由源或使用可见VInt编码(而不是速度的传奇PForDelta). ...
- Cannot update paths and switch to branch at the same time(转)
当使用git进行操作: git checkout -b local-name origin/remote-name 出现错误: fatal: git checkout: updating paths ...
- EF 增删改查 泛型方法、类
1.定义泛型类 namespace Crm.Data.Logic.Repository{ public abstract class AbstractRepository<TC, T> ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架 ...