Android实现主页底部菜单中间tab图案凸起
文章图片
效果图 因为原来的代码底部导航栏使用的是:LinearLayout + ImageView + TextView 组合,所以:在这里用到了一个及其重要的属性:
【Android实现主页底部菜单中间tab图案凸起】android:clipChildren=”false”。(放在其父布局使其生效,达到想要的效果) 意为是否允许子View超出父View的范围,Boolean型true 、false ,默认true不允许;
下面整个xml文件:
activity里的tab切换和平时是一样的:private ArrayList fragments;
private FragmentTabAdapter tabAdapter;
onCreate方法里:fragments = new ArrayList<>();
fragments.add(TabOneFragment.newInstance());
fragments.add(TabTwoFragment.newInstance());
fragments.add(TabThreeFragment.newInstance());
fragments.add(TabFourFragment.newInstance());
fragments.add(TabFiveFragment.newInstance());
tabAdapter = new FragmentTabAdapter(this, fragments, R.id.fl_layout);
/**
*底部导航栏的点击事件
* @param view
*/
@OnClick({R.id.ll_tab_one,R.id.ll_tab_two,R.id.ll_tab_three,R.id.ll_tab_four,R.id.ll_tab_five})
public void onClicked(View view) {
switch (view.getId()){
case R.id.ll_tab_one:
tabAdapter.setCurrentFragment(0);
break;
case R.id.ll_tab_two:
tabAdapter.setCurrentFragment(1);
break;
case R.id.ll_tab_three:
tabAdapter.setCurrentFragment(2);
break;
case R.id.ll_tab_four:
tabAdapter.setCurrentFragment(3);
break;
case R.id.ll_tab_five:
tabAdapter.setCurrentFragment(4);
break;
}
}
protected void initListener() {
tabAdapter.setOnTabChangeListener(new FragmentTabAdapter.OnTabChangeListener() {
@Override
public void OnTabChanged(int index) {
tvTabOne.setTextColor(getResources().getColor(R.color.col_gray));
tvTabTwo.setTextColor(getResources().getColor(R.color.col_gray));
tvTabThree.setTextColor(getResources().getColor(R.color.col_gray));
tvTabFour.setTextColor(getResources().getColor(R.color.col_gray));
tvTabFive.setTextColor(getResources().getColor(R.color.col_gray));
ivTabOne.setImageResource(R.mipmap.ic_tab_home_normal);
ivTabTwo.setImageResource(R.mipmap.ic_tab_friend_normal);
ivTabThree.setImageResource(R.mipmap.ic_tab_search_normal);
ivTabFour.setImageResource(R.mipmap.ic_tab_rank_normal);
ivTabFive.setImageResource(R.mipmap.ic_tab_person_normal);
switch (index){
case 0:
tvTabOne.setTextColor(getResources().getColor(R.color.colorPrimary));
ivTabOne.setImageResource(R.mipmap.ic_tab_home_selected);
break;
case 1:
tvTabTwo.setTextColor(getResources().getColor(R.color.colorPrimary));
ivTabTwo.setImageResource(R.mipmap.ic_tab_friend_selected);
break;
case 2:
tvTabThree.setTextColor(getResources().getColor(R.color.colorPrimary));
ivTabThree.setImageResource(R.mipmap.ic_tab_search_selected);
break;
case 3:
tvTabFour.setTextColor(getResources().getColor(R.color.colorPrimary));
ivTabFour.setImageResource(R.mipmap.ic_tab_rank_selected);
break;
case 4:
tvTabFive.setTextColor(getResources().getColor(R.color.colorPrimary));
ivTabFive.setImageResource(R.mipmap.ic_tab_person_selected);
break;
}}
});
}
FragmentTabAdapter代码:
public class FragmentTabAdapter {
private List fragments;
// tab页面对应的Fragment
private FragmentActivity fragmentActivity;
// Fragment所在的Activity
private int fragmentContentId;
// Activity中所要被替换的区域的id
private int currentTab;
// 当前Tab页面索引
private OnTabChangeListener onTabChangeListener;
public FragmentTabAdapter(FragmentActivity fragmentActivity,
List fragments, int fragmentContentId) {
this.fragments = fragments;
this.fragmentActivity = fragmentActivity;
this.fragmentContentId = fragmentContentId;
// 默认显示第一页
FragmentTransaction ft = fragmentActivity.getSupportFragmentManager()
.beginTransaction();
ft.add(fragmentContentId, fragments.get(0));
try {
ft.commitAllowingStateLoss();
}catch (Exception e){
e.printStackTrace();
}
if (null != onTabChangeListener)
onTabChangeListener.OnTabChanged(0);
}/**
* 切换tab
* @param idx
*/
private void showTab(int idx) {
for (int i = 0;
i < fragments.size();
i++) {
Fragment fragment = fragments.get(i);
FragmentTransaction ft = obtainFragmentTransaction(idx);
if (idx == i) {
ft.show(fragment);
} else {
ft.hide(fragment);
}
ft.commitAllowingStateLoss();
}
currentTab = idx;
// 更新目标tab为当前tab
}/**
* 获取带动画的FragmentTransaction
* @param index
* @return
*/
private FragmentTransaction obtainFragmentTransaction(int index) {
FragmentTransaction ft = fragmentActivity.getSupportFragmentManager()
.beginTransaction();
// 设置切换动画
//if (index > currentTab) {
//ft.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out);
//} else {
//ft.setCustomAnimations(R.anim.slide_right_in,
//R.anim.slide_right_out);
//}
return ft;
}public int getCurrentTab() {
return currentTab;
}public Fragment getCurrentFragment() {
return fragments.get(currentTab);
}public void setCurrentFragment(int idx) {
Fragment fragment = fragments.get(idx);
FragmentTransaction ft = obtainFragmentTransaction(idx);
getCurrentFragment().onPause();
// 暂停当前tab
// getCurrentFragment().onStop();
// 暂停当前tab
if (fragment.isAdded()) {
// fragment.onStart();
// 启动目标tab的onStart()
fragment.onResume();
// 启动目标tab的onResume()
} else {
ft.add(fragmentContentId, fragment);
}
showTab(idx);
// 显示目标tab
ft.commitAllowingStateLoss();
// 如果设置了切换tab额外功能功能接口
if (null != onTabChangeListener) {
onTabChangeListener.OnTabChanged(idx);
}
}public void setOnTabChangeListener(OnTabChangeListener onTabChangeListener) {
this.onTabChangeListener = onTabChangeListener;
}public interface OnTabChangeListener {
public void OnTabChanged(int index);
}}
推荐阅读
- android第三方框架(五)ButterKnife
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树