android 底部導航總結

來源:互聯網
上載者:User

標籤:android   viewpager   底部導航   

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

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

先說說使用viewPager實現的原因

1、fragment

a  我們需要使用fragment的話,我們只能用v4包裡面的fragment,因為我們需要向下相容。
b  當我們用V4包裡面的fragment的時候,系統會自動添加一個節點。
c  fragment不允許嵌套fragmentd  這個Google是在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即可。

<span style="white-space:pre"></span>private boolean setTouchMode = false;<span style="white-space:pre"></span>@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {if (setTouchMode)return super.onInterceptTouchEvent(ev);elsereturn false;}<span style="white-space:pre"></span>@Overridepublic boolean onTouchEvent(MotionEvent ev) {if(setTouchMode)   return super.onTouchEvent(ev);elsereturn false;}

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

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/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>

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() {@Overridepublic void onPageSelected(int position) {BasePager pager = pages.get(position);pager.onResume();pager.initData();}@Overridepublic void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}@Overridepublic void onPageScrollStateChanged(int state) {}});main_radio.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic 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);}@Overrideprotected void onResume() {super.onResume();pages.get(oldPosition).onResume();}@Overrideprotected 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;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {((MyViewPager) container).removeView(list.get(position).getRootView());}@Overridepublic Object instantiateItem(ViewGroup container, int position) {((MyViewPager) container).addView(list.get(position).getRootView(),0);return list.get(position).getRootView();}@Overridepublic int getCount() {return list.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}}@Overrideprotected void onDestroy() {if (pages != null) {for (BasePager pager : pages) {pager.onDestroy();}}super.onDestroy();}}


最後上





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










android 底部導航總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.