Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 底部導航總結

android 底部導航總結

編輯:關於Android編程

實現android 底部導航的方式有好幾種如:fragment:、TabActivity、ViewGroup、viewPager等,

這裡介紹使用viewPager實現底部導航。

先說說使用viewPager實現的原因

1、fragment

a 我們需要使用fragment的話,我們只能用v4包裡面的fragment,因為我們需要向下兼容。
b 當我們用V4包裡面的fragment的時候,系統會自動添加一個節點。
c fragment不允許嵌套fragmentd 這個谷歌是在4.2裡面才解決的。假如我的SDK的版本不進行更新的話,是找不到這個方法的。

android.support.v4.app的Fragment中找不到getChildFragmentManager()方法
2、viewPager:

a 因為使用起來方便。
3、TabActivity:
a TabActivity 過時,直接使用fragment 即可
b Activity是android裡面的四大組件。是重量級的組件,fragment是android裡面的片段,是特殊的view,他具備生命周期。
4、ViewGroup :

a :屬於低級組件。比較麻煩。
首先自定義懶加載的viewpager,目的是 :不需要讓viewpage默認加載下一頁。
查看ViewPager的源碼發現有這麼一個變量DEFAULT_OFFSCREEN_PAGES 控制加載頁面的個數
private static final int DEFAULT_OFFSCREEN_PAGES = 1;//默認加載page的大小
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;
final int pageLimit = mOffscreenPageLimit;
final int startPos = Math.max(0, mCurItem - pageLimit);
final int N = mAdapter.getCount();
final int endPos = Math.min(N-1, mCurItem + pageLimit);

當DEFAULT_OFFSCREEN_PAGES=1時 選擇第一個pager時,即mCurItem =0時 假如說一共有3個頁面 N=3

startPos = Math.max(0, mCurItem - pageLimit); startPos=0

endPos = Math.min(N-1, mCurItem + pageLimit); endPos=1

當DEFAULT_OFFSCREEN_PAGES=1時 選擇第二個pager時,即mCurItem =1時 假如說一共有3個頁面 N=3

startPos = Math.max(0, mCurItem - pageLimit); startPos=1

endPos = Math.min(N-1, mCurItem + pageLimit); endPos=2

當DEFAULT_OFFSCREEN_PAGES=1時 選擇第三個pager時,即mCurItem =2時 假如說一共有3個頁面 N=3

startPos = Math.max(0, mCurItem - pageLimit); startPos=2

endPos = Math.min(N-1, mCurItem + pageLimit); endPos=2

故若想實現不需要讓viewpage默認加載下一頁,只需更改變量值為0即可。

private static final int DEFAULT_OFFSCREEN_PAGES = 0;//默認的加載頁面,ViewPager是1個,所以會加載兩個Fragment

當DEFAULT_OFFSCREEN_PAGES=0時 選擇第一個pager時,即mCurItem =0時 假如說一共有3個頁面 N=3

startPos = Math.max(0, mCurItem - pageLimit); startPos=0

endPos = Math.min(N-1, mCurItem + pageLimit); endPos=0

當DEFAULT_OFFSCREEN_PAGES=0時 選擇第二個pager時,即mCurItem =1時 假如說一共有3個頁面 N=3

startPos = Math.max(0, mCurItem - pageLimit); startPos=1

endPos = Math.min(N-1, mCurItem + pageLimit); endPos=1

當DEFAULT_OFFSCREEN_PAGES=0時 選擇第三個pager時,即mCurItem =2時 假如說一共有3個頁面 N=3

startPos = Math.max(0, mCurItem - pageLimit); startPos=2

endPos = Math.min(N-1, mCurItem + pageLimit); endPos=2

解決了ViewPager預加載的問題,下面解決禁止ViewPager滑動

重寫兩個方法就可以禁止ViewPager滑動了,如果想實現可以滑動 將變量setTouchMode改為true即可。

	private boolean setTouchMode = false;
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		if (setTouchMode)
			return super.onInterceptTouchEvent(ev);
		else
			return false;
	}

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		if(setTouchMode)
		   return super.onTouchEvent(ev);
		else
			return false;
	}

下面是主頁面的布局代碼activity_main.xml




    

    

        

        

        

        
    


MainActivity.java 源代碼


package com.yuweiguo.bottomnavibyviewpager;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;

import com.yuweiguo.bottomnavibyviewpager.base.BasePager;
import com.yuweiguo.bottomnavibyviewpager.pager.MessagePager;
import com.yuweiguo.bottomnavibyviewpager.pager.NaviPager;
import com.yuweiguo.bottomnavibyviewpager.pager.RouteplanPager;
import com.yuweiguo.bottomnavibyviewpager.pager.SearchPager;
import com.yuweiguo.bottomnavibyviewpager.view.LazyViewPager.OnPageChangeListener;
import com.yuweiguo.bottomnavibyviewpager.view.MyViewPager;

public class MainActivity extends Activity {
	private MyViewPager viewpager;
	private RadioGroup main_radio;
	private List pages = new ArrayList();
	private ViewPageAdapter viewPageAdapter;
	private int currentItem = R.id.rb_navi;
	private int oldPosition = 2;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		viewpager = (MyViewPager) findViewById(R.id.viewpager);
		main_radio = (RadioGroup) findViewById(R.id.main_radio);
		pages.clear();
		pages.add(new NaviPager(this));
		pages.add(new RouteplanPager(this));
		pages.add(new SearchPager(this));
		pages.add(new MessagePager(this));
		viewPageAdapter = new ViewPageAdapter(pages);
		viewpager.setAdapter(viewPageAdapter);
		viewpager.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int position) {
				BasePager pager = pages.get(position);
				pager.onResume();
				pager.initData();
			}

			@Override
			public void onPageScrolled(int position, float positionOffset,
					int positionOffsetPixels) {

			}

			@Override
			public void onPageScrollStateChanged(int state) {

			}
		});
		main_radio.setOnCheckedChangeListener(new OnCheckedChangeListener() {

			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				switch (checkedId) {
				case R.id.rb_navi:
					if (oldPosition != 0) {
						pages.get(oldPosition).onPause();
						oldPosition = 0;
					}
					viewpager.setCurrentItem(0, false);
					break;
				case R.id.rb_routeplan:
					if (oldPosition != 1) {
						pages.get(oldPosition).onPause();
						oldPosition = 1;
					}
					viewpager.setCurrentItem(1, false);
					break;
				case R.id.rb_location:
					if (oldPosition != 2) {
						pages.get(oldPosition).onPause();
						oldPosition = 2;
					}
					viewpager.setCurrentItem(2, false);
					break;
				case R.id.rb_setting:
					if (oldPosition != 3) {
						pages.get(oldPosition).onPause();
						oldPosition = 3;
					}
					viewpager.setCurrentItem(3, false);
					break;
				}
				currentItem = checkedId;
			}
		});
		main_radio.check(currentItem);

	}

	@Override
	protected void onResume() {
		super.onResume();
		pages.get(oldPosition).onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
		pages.get(oldPosition).onPause();
	}

	public class ViewPageAdapter extends PagerAdapter {
		private List list;

		public ViewPageAdapter(List pages) {
			this.list = pages;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			((MyViewPager) container).removeView(list.get(position)
					.getRootView());
		}

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			((MyViewPager) container).addView(list.get(position).getRootView(),
					0);
			return list.get(position).getRootView();
		}

		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}
	}


	@Override
	protected void onDestroy() {
		if (pages != null) {
			for (BasePager pager : pages) {
				pager.onDestroy();
			}
		}
		super.onDestroy();
	}

}


最後上效果圖





最後 獻上免費源碼http://download.csdn.net/detail/gfbgl/8196027










  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved