Android開發之利用ViewPager實現頁面的切換(仿微信、QQ)


這里利用ViewPager實現頁面的滑動,下面直接上代碼:

1、首先寫一個Activity,然后將要滑動的Fragment鑲嵌到寫好的Activity中。

Activity的布局文件:activity_main.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7       <FrameLayout
 8            android:id="@+id/id_content"
 9            android:layout_weight="1"
10            android:layout_width="match_parent"
11            android:layout_height="0dp"/>
12 
13     <android.support.v4.view.ViewPager
14         android:id="@+id/id_viewpage"
15         android:layout_width="fill_parent"
16         android:layout_height="0dp"
17         android:layout_weight="0.001" >
18     </android.support.v4.view.ViewPager>
19 
20     <include layout="@layout/bottom" />
21 
22 </LinearLayout>

activity_main.xml中引入的布局(下面的切換的部分)

bottom.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="55dp"
 5     android:background="@drawable/bottom"
 6     android:orientation="horizontal" >
 7 
 8     <LinearLayout
 9         android:id="@+id/id_tab_education"
10         android:layout_width="0dp"
11         android:layout_height="match_parent"
12         android:layout_weight="1"
13         android:gravity="center"
14         android:orientation="vertical" >
15 
16         <!-- android:clickable="false" 是為了防止ImageButton截取了觸摸事件 ,這里事件要給它的上一級linearlayout -->
17 
18         <ImageButton
19             android:id="@+id/id_tab_education_img"
20             android:layout_width="wrap_content"
21             android:layout_height="wrap_content"
22             android:background="#00000000"
23             android:clickable="false"
24             android:src="@drawable/tab_bar_01_check" />
25 
26         <TextView
27             android:layout_width="wrap_content"
28             android:layout_height="wrap_content"
29             android:text="@string/bottom_jurisdiction" />
30     </LinearLayout>
31 
32     <LinearLayout
33         android:id="@+id/id_tab_frd"
34         android:layout_width="0dp"
35         android:layout_height="match_parent"
36         android:layout_weight="1"
37         android:gravity="center"
38         android:orientation="vertical" >
39 
40         <ImageButton
41             android:id="@+id/id_tab_frd_img"
42             android:layout_width="wrap_content"
43             android:layout_height="wrap_content"
44             android:background="#00000000"
45             android:clickable="false"
46             android:src="@drawable/tab_bar_04" />
47 
48         <TextView
49             android:layout_width="wrap_content"
50             android:layout_height="wrap_content"
51             android:text="@string/bottom_discover" />
52     </LinearLayout>
53 
54     <LinearLayout
55         android:id="@+id/id_tab_setting"
56         android:layout_width="0dp"
57         android:layout_height="match_parent"
58         android:layout_weight="1"
59         android:gravity="center"
60         android:orientation="vertical" >
61 
62         <ImageButton
63             android:id="@+id/id_tab_setting_img"
64             android:layout_width="wrap_content"
65             android:layout_height="wrap_content"
66             android:background="#00000000"
67             android:clickable="false"
68             android:src="@drawable/tab_bar_05" />
69 
70         <TextView
71             android:layout_width="wrap_content"
72             android:layout_height="wrap_content"
73             android:text="@string/bottom_my" />
74     </LinearLayout>
75 
76 </LinearLayout>

MainActivity.class(用來鑲嵌Fragment)

  1 package com.example.activity;
  2 
  3 import com.example.fragment.SeekFragment;
  4 import com.example.fragment.ProcedureFragment;
  5 import com.example.fragment.MyFragment;
  6 import com.example.myproject.R;
  7 
  8 import android.app.Activity;
  9 import android.os.Bundle;
 10 import android.support.v4.app.Fragment;
 11 import android.support.v4.app.FragmentActivity;
 12 import android.support.v4.app.FragmentManager;
 13 import android.support.v4.app.FragmentTransaction;
 14 import android.support.v4.view.ViewPager;
 15 import android.support.v4.view.ViewPager.OnPageChangeListener;
 16 import android.view.KeyEvent;
 17 import android.view.View;
 18 import android.view.View.OnClickListener;
 19 import android.view.Window;
 20 import android.widget.ImageButton;
 21 import android.widget.LinearLayout;
 22 import android.widget.Toast;
 23 
 24 public class MainActivity extends FragmentActivity implements OnClickListener{
 25 
 26     private long lastTime;//退出鍵的最后時間
 27     private ViewPager mViewPager;// 用來放置界面切換
 28     // 三個Tab,每個Tab包含一個按鈕
 29     private LinearLayout mTabEducation;
 30     private LinearLayout mTabFrd;
 31     private LinearLayout mTabSetting;
 32     // 三個按鈕
 33     private ImageButton mEducationImg;
 34     private ImageButton mFrdImg;
 35     private ImageButton mSettingImg;
 36     // 初始化3個Fragment
 37     private Fragment jurisdiction;
 38     private Fragment discover;
 39     private Fragment setting;
 40 
 41     @Override
 42     protected void onCreate(Bundle savedInstanceState) {
 43         // TODO Auto-generated method stub
 44         super.onCreate(savedInstanceState);
 45         requestWindowFeature(Window.FEATURE_NO_TITLE);
 46         setContentView(R.layout.activity_main);
 47         
 48         initView();
 49         initEvent();
 50         initViewPage(0);
 51     }
 52 
 53     /*
 54      * 判斷哪個要顯示,及設置按鈕圖片
 55      */
 56     @Override
 57     public void onClick(View arg0) {
 58         switch (arg0.getId()) {
 59         case R.id.id_tab_education:
 60             initViewPage(0);
 61             mViewPager.setCurrentItem(0);
 62             resetImg();
 63             mEducationImg.setImageResource(R.drawable.tab_bar_01_check);
 64             break;
 65         case R.id.id_tab_frd:
 66             initViewPage(1);
 67             mViewPager.setCurrentItem(1);
 68             resetImg();
 69             mFrdImg.setImageResource(R.drawable.tab_bar_04_check);
 70             break;
 71         case R.id.id_tab_setting:
 72             initViewPage(2);
 73             mViewPager.setCurrentItem(2);
 74             resetImg();
 75             mSettingImg.setImageResource(R.drawable.tab_bar_05_check);
 76             break;
 77         default:
 78             break;
 79         }
 80     }
 81 
 82     /*
 83      * 初始化配置
 84      */
 85     private void initView() {
 86         mViewPager = (ViewPager) findViewById(R.id.id_viewpage);
 87         // 初始化三個LinearLayout
 88         mTabEducation = (LinearLayout) findViewById(R.id.id_tab_education);
 89         mTabFrd = (LinearLayout) findViewById(R.id.id_tab_frd);
 90         mTabSetting = (LinearLayout) findViewById(R.id.id_tab_setting);
 91         // 初始化三個按鈕
 92         mEducationImg = (ImageButton) findViewById(R.id.id_tab_education_img);
 93         mFrdImg = (ImageButton) findViewById(R.id.id_tab_frd_img);
 94         mSettingImg = (ImageButton) findViewById(R.id.id_tab_setting_img);
 95     }
 96 
 97     /*
 98      * 初始化initViewPage
 99      */
100     private void initViewPage(int i) {
101         FragmentManager fm = getSupportFragmentManager();
102         FragmentTransaction transaction = fm.beginTransaction();// 創建一個事務
103         hideFragment(transaction);// 我們先把所有的Fragment隱藏了,然后下面再開始處理具體要顯示的Fragment
104         switch (i) {
105         case 0:
106             if (jurisdiction == null) {
107                 jurisdiction = new ProcedureFragment();
108                 transaction.add(R.id.id_content, jurisdiction);// 將微信聊天界面的Fragment添加到Activity中
109             } else {
110                 transaction.show(jurisdiction);
111             }
112             break;
113         case 1:
114             if (discover == null) {
115                 discover = new SeekFragment();
116                 transaction.add(R.id.id_content, discover);
117             } else {
118                 transaction.show(discover);
119             }
120             break;
121         case 2:
122             if (setting == null) {
123                 setting = new MyFragment();
124                 transaction.add(R.id.id_content, setting);
125             } else {
126                 transaction.show(setting);
127             }
128             break;
129 
130         default:
131             break;
132         }
133         
134         transaction.commit();// 提交事務
135     }
136 
137     private void initEvent() {
138         mTabEducation.setOnClickListener(this);
139         mTabFrd.setOnClickListener(this);
140         mTabSetting.setOnClickListener(this);
141         mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
142             @Override
143             public void onPageSelected(int arg0) {
144                 int currentItem = mViewPager.getCurrentItem();
145                 switch (currentItem) {
146                 case 0:
147                     resetImg();
148                     mEducationImg.setImageResource(R.drawable.tab_bar_01_check);
149                     break;
150                 case 1:
151                     resetImg();
152                     mFrdImg.setImageResource(R.drawable.tab_bar_04_check);
153                     break;
154                 case 2:
155                     resetImg();
156                     mSettingImg.setImageResource(R.drawable.tab_bar_05_check);
157                 default:
158                     break;
159                 }
160             }
161 
162             @Override
163             public void onPageScrolled(int arg0, float arg1, int arg2) {
164 
165             }
166 
167             @Override
168             public void onPageScrollStateChanged(int arg0) {
169 
170             }
171         });
172     }
173 
174     /*
175      * 隱藏所有的Fragment
176      */
177     private void hideFragment(FragmentTransaction transaction) {
178         if (jurisdiction != null) {
179             transaction.hide(jurisdiction);
180         }
181         if (discover != null) {
182             transaction.hide(discover);
183         }
184         if (setting != null) {
185             transaction.hide(setting);
186         }
187     }
188 
189     /*
190      * 把所有圖片變暗
191      */
192     private void resetImg() {
193         mEducationImg.setImageResource(R.drawable.tab_bar_01);
194         mFrdImg.setImageResource(R.drawable.tab_bar_04);
195         mSettingImg.setImageResource(R.drawable.tab_bar_05);
196     }
197     @Override
198     public boolean onKeyDown(int keyCode, KeyEvent event) {
199 
200         if (keyCode == KeyEvent.KEYCODE_BACK) {
201             if (System.currentTimeMillis() - lastTime <= 2000) {
202                 finish();
203             } else {
204                 Toast.makeText(this, "再按一次退出程序", 1000).show();
205                 lastTime = System.currentTimeMillis();
206             }
207             return false;
208         }
209         return super.onKeyDown(keyCode, event);
210     }
211 }

通過以上代碼即可實現微信或QQ的那種頁面的切換了,具體里面的內容則根據自身情況在相應的fragment中來實現。

下面給一個一個空的Fragment,以此為藍圖,剩余的部分可以在此基礎上更改添加。

SeekFragment.java

 1 package com.example.fragment;
 2 
 3 import com.example.myproject.R;
 4 
 5 import android.os.Bundle;
 6 import android.support.v4.app.Fragment;
 7 import android.view.LayoutInflater;
 8 import android.view.View;
 9 import android.view.ViewGroup;
10 /**
11  * 查找fragment
12  * @author admin
13  *
14  */
15 public class SeekFragment extends Fragment {
16     private View rootView;
17     @Override
18     public View onCreateView(LayoutInflater inflater, ViewGroup container,
19             Bundle savedInstanceState) {
20         if (null == rootView) {
21             rootView = inflater.inflate(R.layout.fragment_seek, container,
22                     false);
23             initView(rootView);
24         }
25         return rootView;
26     }
27     /**
28      * 用於初始化,具體操作視自己情況而定
29      * @param rootView
30      */
31     private void initView(View rootView) {
32 
33     }
34 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM