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;
} </pre>下面是主頁面的布局代碼activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" ><view android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1.0" class="com.yuweiguo.bottomnavibyviewpager.view.MyViewPager" /> <RadioGroup android:id="@+id/main_radio" android:layout_width="fill_parent" android:layout_height="60dp" android:layout_gravity="bottom" android:background="#133575" android:gravity="center_vertical" android:orientation="horizontal" android:paddingTop="2dp" > <RadioButton android:id="@+id/rb_navi" style="@style/main_tab_bottom" android:drawableTop="@drawable/tab_selector1" /> <RadioButton android:id="@+id/rb_routeplan" style="@style/main_tab_bottom" android:drawableTop="@drawable/tab_selector2" /> <RadioButton android:id="@+id/rb_location" style="@style/main_tab_bottom" android:drawableTop="@drawable/tab_selector3" /> <RadioButton android:id="@+id/rb_setting" style="@style/main_tab_bottom" android:drawableTop="@drawable/tab_selector4" /> </RadioGroup> </LinearLayout> </pre><br />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<BasePager> pages = new ArrayList<BasePager>(); 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<BasePager> list; public ViewPageAdapter(List<BasePager> 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(); } } </pre><br />
最后上效果圖
![]()
最后 獻上免費源碼http://download.csdn.net/detail/gfbgl/8196027
來自:http://blog.csdn.net/growth58/article/details/41477079