Android 底部導航總結

jopen 10年前發布 | 12K 次閱讀 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;
} </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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!