編輯:關於Android編程
實現android 底部導航的方式有好幾種如:fragment:、TabActivity、ViewGroup、viewPager等,
這裡介紹使用viewPager實現底部導航。
先說說使用viewPager實現的原因
1、fragment
a 我們需要使用fragment的話,我們只能用v4包裡面的fragment,因為我們需要向下兼容。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
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();
}
}
最後上效果圖

Android逆向之旅---解析編譯之後的Resource.arsc文件格式
一、前言快過年了,先提前祝賀大家新年快樂,這篇文章也是今年最後一篇了。今天我們繼續來看逆向的相關知識,前篇文章中我們介紹了如何解析Android中編譯之後的Android
Android 筆記-Fragment 與 Activity之間傳遞數據
Fragment 與 Activity之間傳遞數據有兩種方法,一種是使用setArgument,一種是使用接口回調。下面先學習第一種方法。 (1)使用setArgum
Android-如何將用戶設置進行保存?(內部存儲、SD卡,用類作為媒介)
本次實例是將用戶的設置信息,以實體類為媒介,保存到內部存儲或者SD卡的文件裡。再次打開應用時,程序會自動調用文件中實體類,並對設置信息進行設置,使其恢復到用戶最終保存的狀
Android漫游記(2)---ELF可執行文件格式
ELF是類Unix類系統,當然也包括Android系統上的可執行文件格式(也包括.so和.o類文件)。可以理解為Android系統上的exe或者dll文件&