Android底部导航总结
source link: http://www.androidchina.net/1263.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
实现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即可。
@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
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
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() {
@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();
}
}
最后上效果图
转载请注明:Android开发中文站 » Android底部导航总结
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK