ViewPager在v4包中症汹,所以布局文件應(yīng)該這么寫(xiě):
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000" >
</android.support.v4.view.ViewPager>
ViewPager的功能就是可以使視圖滑動(dòng)踢故,用途主要有:首次啟動(dòng)應(yīng)用的引導(dǎo)頁(yè)塑崖,以及滑動(dòng)的Tab界面設(shè)計(jì)七冲。要注意的是,上面一段代碼只是用來(lái)顯示左右滑動(dòng)的界面的规婆,如果不加載xml布局文件澜躺,他是不會(huì)顯示內(nèi)容的。 這個(gè)和ListView很像抒蚜。
過(guò)程分3步:
第1步掘鄙,創(chuàng)建一個(gè)View的List集合。
第2步嗡髓,使用ViewAdapter裝載這個(gè)集合操漠。
第3步,給ViewPager設(shè)置ViewAdapter饿这。
//第1步浊伙,創(chuàng)建一個(gè)View的集合,并動(dòng)態(tài)加載n個(gè)View长捧,添加進(jìn)集合
LayoutInflater inflater = LayoutInflater.from(this);
views = new ArrayList<View>();
views.add(inflater.inflate(R.layout.guideone, null));
views.add(inflater.inflate(R.layout.guidetwo, null));
views.add(inflater.inflate(R.layout.guidethree, null));
//第2步嚣鄙,為ViewAdapter裝載這個(gè)集合
vpAdapter = new ViewPagerAdapter(views, this);
//第3步,給ViewPager設(shè)置ViewAdapter
vp= (ViewPager) findViewById(R.id.view_pager);
vp.setAdapter(vpAdapter);
此處我新創(chuàng)建的一個(gè)ViewPagerAdapter類(lèi)繼承自PaperAdapter串结,當(dāng)然也可以直接new一個(gè)PagerAdapter哑子。其中的內(nèi)容也是分3個(gè)部分:
第1部分:構(gòu)造函數(shù)
第2部分:加載、銷(xiāo)毀View的方法
第3部分:自動(dòng)生成的兩個(gè)有返回值的方法
public class ViewPagerAdapter extends PagerAdapter {
//創(chuàng)建兩個(gè)變量肌割,并作為參數(shù)傳入構(gòu)造方法
private List<View> views ;
private Context context;
public ViewPagerAdapter(List<View> views, Context context) {
super();
this.views = views;
this.context = context;
}
//不要的時(shí)候赵抢,銷(xiāo)毀View的方法,根據(jù)position進(jìn)行索引,并制定View為ViewPager
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views.get(position));
}
//加載View的方法声功,類(lèi)似于AdapterView中的getView方法
@Override
public Object instantiateItem(ViewGroup container, int position) {
//添加頁(yè)卡(遍歷View這個(gè)集合烦却,加載所有View作為頁(yè)卡)
View view =views.get(position);
container.addView(view);
return view;
}
//直接返回View集合的大小即可
@Override
public int getCount() {
return views.size();
}
//判斷當(dāng)前的View是否是我們需要的對(duì)象
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return (arg0 ==arg1);
}
}
下面是一個(gè)引導(dǎo)頁(yè)的實(shí)例:
代碼除了上面創(chuàng)建的ViewAdapter子類(lèi)外,還有3個(gè)activity分別為:主頁(yè)面先巴,歡迎頁(yè)面其爵,引導(dǎo)頁(yè)頁(yè)面。
這里的ImageView 實(shí)例和 ImageView的id都使用了數(shù)組伸蚯,一般而言ViewPager不會(huì)太多摩渺,也可以不用數(shù)組。
public class Guide extends Activity implements OnPageChangeListener{
private ViewPager vp;
private ViewPagerAdapter vpAdapter;
private List<View> views;
private ImageView [] dots;
private int [] ids = {R.id.iv1,R.id.iv2,R.id.iv3};
private Button start_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.guide);
initViews();
initDots();
}
//初始化方法中剂邮,先給ViewAdapter添加內(nèi)容(就是3個(gè)View)摇幻,然后給ViewPager設(shè)置ViewAdatper,最后添加監(jiān)聽(tīng)事件回調(diào)方法
private void initViews() {
LayoutInflater inflater = LayoutInflater.from(this);
views = new ArrayList<View>();
views.add(inflater.inflate(R.layout.guideone, null));
views.add(inflater.inflate(R.layout.guidetwo, null));
views.add(inflater.inflate(R.layout.guidethree, null));
vpAdapter = new ViewPagerAdapter(views, this);
vp= (ViewPager) findViewById(R.id.view_pager);
vp.setAdapter(vpAdapter);
//嚴(yán)重注意此處的Button不在我們的布局當(dāng)中,當(dāng)前的布局是guide绰姻,Button存在于集合中枉侧,所以要使用get,取得元素狂芋,和getChild是有區(qū)別的榨馁,不然會(huì)有空指針異常
start_btn = (Button) views.get(2).findViewById(R.id.start_btn);
start_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Guide.this, MainActivity.class);
startActivity(intent);
//這個(gè)finish必須寫(xiě)上,不然后退回Guide界面就太丑了
finish();
}
});
vp.setOnPageChangeListener(this);
}
//初始化dots方法中帜矾,找到了每一個(gè)dots的對(duì)象翼虫,相當(dāng)于一個(gè)個(gè)find出來(lái),但對(duì)于大型數(shù)據(jù)用兩個(gè)數(shù)組的方式更好
private void initDots(){
dots = new ImageView[views.size()];
for(int i =0; i<views.size(); i++){
dots[i]= (ImageView) findViewById(ids[i]);
}
}
//當(dāng)前頁(yè)面被選中時(shí)調(diào)用
@Override
public void onPageSelected(int arg0) {
for(int i =0; i< ids.length; i++){
if (arg0 ==i){
dots[i].setImageResource(R.drawable.login_point_selected);
}else{
dots[i].setImageResource(R.drawable.login_point);
}
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
}
public class Welcome extends Activity {
private boolean isFirstIn =false;
private static final int Time =2000;
private static final int Go_Home= 1000;
private static final int Go_Guide= 1001;
//在主線程中做 延時(shí)操作是不合理的屡萤,可以使用handler
Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case Go_Home:
go_Home();
break;
case Go_Guide:
go_Guide();
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.welcome);
init();
}
private void init() {
SharedPreferences preferences = getSharedPreferences("suibianqu", MODE_PRIVATE);
//先去取isFirstI的值珍剑,如果沒(méi)有,表明是第一次取死陆,第一次取肯定是true
isFirstIn = preferences.getBoolean("isFirstIn", true);
//通過(guò)isFirstIn選擇啟動(dòng)哪個(gè)頁(yè)面招拙,再將新boolean值存入SharedPreferences
if(isFirstIn){
mHandler.sendEmptyMessageDelayed(Go_Guide, Time); //制定多少毫秒后發(fā)送空消息,第一個(gè)參數(shù)是一個(gè)int what值
Editor editor = preferences.edit();
editor.putBoolean("isFirstIn", false);
editor.commit();
}else{
mHandler.sendEmptyMessageDelayed(Go_Home, Time);
}
}
private void go_Home(){
Intent intent = new Intent(Welcome.this, MainActivity.class);
startActivity(intent);
finish(); //用了finish翔曲,就不能后退回welcome頁(yè)面了迫像, onActivityResult()也不能使用
}
private void go_Guide(){
Intent intent = new Intent(Welcome.this, Guide.class);
startActivity(intent);
finish();
}
}