Android開發---Viewpager+Fragment使用指南
Viewpager+Fragment
使用步驟:
一.匯入jar包
android-support-v4.jar
二.Activity佈局
<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:flipInterval="3000"à動畫效果
android:persistentDrawingCache="animation"/>à記憶體設定
三.Activity程式碼
繼承FragmentActivity
1.變數
1. .選項卡及陣列
private RelativeLayout mTab1;
private RelativeLayout mTab2;
private RelativeLayout mTab3;
private RelativeLayout mTab4;
privateRelativeLayout[] arrBtn = new RelativeLayout[4];
2.滑動頁容器
ViewPagerviewPager;
3.碎片集合
private List<BaseFragment>fragments;à建立碎片的父類
// 碎片物件
private BaseFragment m1 =null;
private BaseFragment m2 =null;
private BaseFragment m3 =null;
private BaseFragment m4 =null;
4.碎片介面卡
private MyFragmentAdapteradapter;à建立碎片介面卡
2.onCreate()
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initListener();
//設定初始值
viewPager.setCurrentItem(0);
setColor(0);
}
3.封裝的方法
(1)initView()
private void initView() {
mTab1 = (RelativeLayout)findViewById(R.id.btn1);
mTab2 = (RelativeLayout)findViewById(R.id.btn2);
mTab3 = (RelativeLayout)findViewById(R.id.btn3);
mTab4 = (RelativeLayout)findViewById(R.id.btn4);
//把選項卡新增到陣列中
arrBtn[0] = mTab1;
arrBtn[1] = mTab2;
arrBtn[2] = mTab3;
arrBtn[3] = mTab4;
//滑動頁容器
viewPager = (ViewPager)findViewById(R.id.vp);
}
(2)initData()
private void initData() {
// 準備碎片
m1 = new ListFragment();
m2 = new ListFragment();
m3 = new ListFragment();
m4 = new OptionFragment();
// 官方存值
Bundle b1 = new Bundle();
b1.putString("key","image");
m1.setArguments(b1);
Bundle b2 = new Bundle();
b2.putString("key","audio");
m2.setArguments(b2); -------------------------------à放入引數
Bundle b3 = new Bundle();
b3.putString("key","video");
m3.setArguments(b3);
// 非官方
m1.setList(MediaUtils.getImageList(this));
m2.setList(MediaUtils.getAudioList(this));
m3.setList(MediaUtils.getVideoList(this));
//把碎片新增到碎片集合中去
fragments = new ArrayList<BaseFragment>();
fragments.add(m1);
fragments.add(m2);
fragments.add(m3);
fragments.add(m4);
// 例項化介面卡
adapter = new MyFragmentAdapater(getSupportFragmentManager());àFragment Activity關聯
adapter.setFragments(fragments);// 新增資料
viewPager.setAdapter(adapter);// 關聯介面卡
}
(3)initListener()
private void initListener() {
// 新增按鈕的監聽
for (int i = 0; i <arrBtn.length; i++) {
arrBtn[i].setOnClickListener(this);
}
// 新增滑動頁的監聽
viewPager.setOnPageChangeListener(this);
}
4.事件回撥函式
(1)單擊事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
viewPager.setCurrentItem(0);// 第一頁
break;
case R.id.btn2:
viewPager.setCurrentItem(1);// 第二頁
break;
case R.id.btn3:
viewPager.setCurrentItem(2);// 第二頁
break;
case R.id.btn4:
viewPager.setCurrentItem(3);// 第二頁
break;
default:
break;
}
}
(2)滑動事件
@Override
public void onPageScrolled(inti, float v, int i2) {
// 滑動過程中...(寫動畫)
}
@Override
public voidonPageSelected(int i) {
// 核心事件
//頁面被選中(當前頁面已經顯示了90%的面積)
setColor(i);
}
@Override
public voidonPageScrollStateChanged(int i) {
// 滑動的狀態改變
}
(3)設定選項卡變色
/**
* 1.將所有的背景統一顏色
* 2.將當前選中的背景設定特殊顏色
* @param index
*/
public void setColor(int index){
for (int i = 0;i<arrBtn.length; i++){
arrBtn[i].setBackgroundColor(Color.BLUE);
}
arrBtn[index].setBackgroundColor(Color.GREEN);// 特殊
}
(三)建立碎片的子類
public class ListFragmentextends BaseFragment {
@Override
public View onCreateView(LayoutInflaterinflater,// 反射器
ViewGroupcontainer, //容器物件(沒用)
BundlesavedInstanceState) {// 儲存狀態的物件(沒用)
// 反射檢視
View view =inflater.inflate(R.layout.fragment_list, container, false);
// 獲取引數值
Bundle b = getArguments();
String s =b.getString("key");
lv = (ListView)view.findViewById(R.id.lv);
adapter = newMyAdapter(getActivity());
getData(s);// 拿資料
return view;
}
MyAdapter adapter;
ListView lv;
private void getData(String s){
adapter.setList(list);
lv.setAdapter(adapter);
}
}
四.其他類
建立碎片的父類
public class BaseFragmentextends Fragment {
publicList<MediaUtils.MediaInfo> list;
public voidsetList(List<MediaUtils.MediaInfo> list) {
this.list = list;
}
}
建立碎片介面卡
public class MyFragmentAdapterextends FragmentPagerAdapter {
privateList<BaseFragment> fragments;
/**
* 構造器
* 碎片管理器
* @param fm
*/
publicMyFragmentAdapter(FragmentManager fm) {
super(fm);
}
public voidsetFragments(List<BaseFragment> fragments) {
this.fragments = fragments;
}
/**
* (滑動時)返回碎片物件
*
* @param i
* @return
*/
@Override
public Fragment getItem(int i){
returnfragments.get(i);
}
@Override
public int getCount() {
return fragments.size();
}
}
建立碎片
public class ListFragmentextends BaseFragment {
List<MediaUtil.MediaInfo> list;---------------à可以在BaseFragment宣告,這裡就不用聲明瞭
MyAdapter adapter;
ListView listView;
//fragment佈局物件
View view;
@Override
public ViewonCreateView(LayoutInflater inflater, ViewGroup container,
BundlesavedInstanceState) {
//反射檢視
view =inflater.inflate(R.layout.fragment_list, container, false);
//獲取引數值
Bundle bundle = getArguments();----------------à獲得引數
//判斷條件
String condition =bundle.getString("key");
initView();
initData(condition);
return view;
}
private void initView() {
listView = (ListView) view.findViewById(R.id.lv);
adapter = newMyAdapter(getActivity());
}
private void initData(Stringcondition) {
//圖片
if(condition.equals("image")) {
list =MediaUtil.getImageList(getActivity());
}
//音訊
if (condition.equals("audio")){
list =MediaUtil.getAudioList(getActivity());
}
//視訊
if(condition.equals("video")) {
list =MediaUtil.getVideoList(getActivity());
}
adapter.setList(list);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
碎片基類
public class BaseFragmentextends Fragment {
publicList<MediaUtil.MediaInfo> list;
public voidsetList(List<MediaUtil.MediaInfo> list) {
this.list = list;
}
}