转载本专栏文章,请注明出处,尊重原创 。文章博客地址:道龙的博客

写在前面的话:此专栏是博主在工作之余所写,每一篇文章尽可能写的思路清晰一些,属于博主的“精华”部分,不同于以往专栏的文章,是直接结合实际开发的。喜欢的朋友可以关注我,给与更好的思路或者意见,哪怕有一点点帮助到您,这才是最重要的。

上一篇模仿微信底部tab的方式实现滑动效果,那里的手段是通过动态添加View的方式,上一篇就提到,实现tab切页面的手段有很多种,本篇就使用另一种方式——ViewPage+Fragment;并对对其中的核心功能做一下封装。

使用过ViewPager小伙伴们都知道,Viewpager加载数据,需要数据源,这里我们定义4个Fragment。为了方便其他同事使用,可以给这4个Fragment添加了一个基类,核心代码如下:

一、底部tab的布局:

看一下继承结构:

核心代码:

<LinearLayout
android:id="@+id/id_tab_bottom_weixin"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:descendantFocusability="beforeDescendants"
android:gravity="center"
android:orientation="vertical" > <ImageButton
android:id="@+id/btn_tab_bottom_weixin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0000"
android:src="@drawable/tab_weixin" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="微信"
android:textColor="#ffffff" />
</LinearLayout>

连续添加四个按钮就好了。

注意:

对于布局中设置控件是否获取焦点,有以下知识点:

我们知道:项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写。诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件)此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。

android:descendantFocusability

Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.

Must be one of the following constant values.

该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。

属性的值有三种:

beforeDescendants:viewgroup会优先其子类控件而获取到焦点

afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

至于用法么,就是在item 里的RelativeLayout 加入android:descendantFocusability="beforeDescendants"

二、创建Fragment的基类,实现子类

public abstract class BaseFragment extends Fragment {

    public Context mContext;

    @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
//获取上下文操作 mContext = getActivity();
super.onCreate(savedInstanceState);
} @Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View curentView = initView();
return curentView;
} @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
initData();//初始化数据
super.onActivityCreated(savedInstanceState);
} /**抽象方法,子类调用*/
public abstract View initView(); public abstract View initData();
}

代码太简单了,增加了一个抽象的initView和一个初始化数据的initData。那么咱们看看一个子类的代码:

public class AddressFragment extends BaseFragment {

    @Override
public View initView() {
return View.inflate(mContext, R.layout.fragment_address,null);
} @Override
public View initData() {
return null;
}
}

其中每个fragment的布局都仅仅是显示一段文本即可。

三、完成核心代码,完成主活动。

我们创建viewPager的adapter类:

public class FragmentAdapter extends FragmentPagerAdapter {

    List<BaseFragment> mFragments = new ArrayList<BaseFragment>();

    public FragmentAdapter(FragmentManager fm, List<BaseFragment> fragments) {
super(fm);
this.mFragments = fragments;
} @Override
public Fragment getItem(int position) {
return mFragments.get(position);
} @Override
public int getCount() {
return mFragments.size();
}
}

然后在活动里面,添加四个fragment,并给viewpage设置好适配器:

//添加fragment
List<BaseFragment> mFragments = new ArrayList<BaseFragment>();
mFragments.add(new WeChatFragment());
mFragments.add(new FriendFragment());
mFragments.add(new AddressFragment());
mFragments.add(new SettingFragment()); //设置不进行预加载
mViewpages.setOffscreenPageLimit(0); FragmentAdapter mAdapter = new FragmentAdapter(getSupportFragmentManager(), mFragments);
mViewpages.setAdapter(mAdapter);

剩下的就是根据点击tab,切换对应的页面就好了。设置如下:

//给ViewPage添加监听事件
mViewpages.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override
public void onPageSelected(int position) {
//选中当前的page页面的时候,调用
changeTab(position);
} @Override
public void onPageScrollStateChanged(int state) { }
}); /**
* 给独步tab的btn加入点击事件
*/
mBtnTabBottomWeixin.setOnClickListener(this);
mBtnTabBottomFriend.setOnClickListener(this);
mBtnTabBottomContact.setOnClickListener(this);
mBtnTabBottomSetting.setOnClickListener(this);
} /**
* 根据当前位置切换对应的fragment
*/
public void changeTab(int position) {
//先清空原来的状态
mBtnTabBottomContact.setSelected(false);
mBtnTabBottomFriend.setSelected(false);
mBtnTabBottomSetting.setSelected(false);
mBtnTabBottomWeixin.setSelected(false); //针对当前position
switch (position) {
case 0://第零页的page
mBtnTabBottomWeixin.setSelected(true);
break;
case 1://第一页
mBtnTabBottomFriend.setSelected(true);
break;
case 2:
mBtnTabBottomContact.setSelected(true);
break;
case 3:
mBtnTabBottomSetting.setSelected(true);
break;
} //根据当前的btn位置,切换fragment页面
mViewpages.setCurrentItem(position);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_tab_bottom_weixin:
changeTab(0);
break;
case R.id.btn_tab_bottom_friend:
changeTab(1);
break;
case R.id.btn_tab_bottom_contact:
changeTab(2);
break;
case R.id.btn_tab_bottom_setting:
changeTab(3);
break;
}
}

最后运行程序看看结果:

看着效果还是蛮好的~

喜欢我的朋友可以关注我哈,也可以直接去下载源码

点击可下载地址:源码地址

也可以打开微信搜索公众号  Android程序员开发指南  或者手机扫描下方二维码 在公众号阅读更多Android文章。

微信公众号图片:

Android Studio精彩案例(三)《模仿微信ViewPage+Fragment实现方式二》的更多相关文章

  1. Android Studio精彩案例(二)《仿微信动态点击底部tab切换Fragment》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 现在很多的App要么顶部带有tab,要么就底部带有tab.用户通过点击tab从而切换不同的页面(大部分情况时去切换fragment). ...

  2. Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了能更好的分享高质量的文章,所以开设了此专栏.文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码.该专栏 ...

  3. Android Studio精彩案例(五)《JSMS短信验证码功能实现》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 很多应用刚打开的时候,让我们输入手机号,通过短信验证码来登录该应用.那么,这个场景是怎么实现的呢?其实是很多开放平台提供了短信验证功能 ...

  4. Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...

  5. Android Studio精彩案例(七)《ToolBar使用详解<一>》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 本文参考博客:http://blog.csdn.net/h_zhang/article/details/51232773 http:/ ...

  6. Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 元旦假期里,闲的无事,看到美团加载数据的动画,就突想写个Demo把动画知识集成一下.后来想了想,还是直接用一个Demo来把所有动画知识 ...

  7. Android Studio系列教程三--快捷键

    Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...

  8. Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!

    Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! 感叹离春节将至,也同时感叹时间不等人,一年又一年,可是我依然是android道路上的小菜鸟,这篇讲 ...

  9. Android studio 使用心得(三)—从Eclipse迁移到Android studio

    断断续续的也算是把eclipse上的代码成功迁移到android studio上来了,现在,我同事继续用eclipse,我用android studio,svn上还是之前eclipse的项目,迁移成功 ...

随机推荐

  1. JavaScript, 函数是实现异步的基础

    昨天一朋友和我聊到JS中的异步和同步, 后来从异步和同步的问题中得出了函数的另一面, 觉得挺不错, 特此分享一下 ==== 追梦子: 聊天是同步还是异步 小A: 异步 小A: 和你聊还可以和别人聊 追 ...

  2. [LeetCode] Couples Holding Hands 两两握手

    N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum numb ...

  3. ios开发- 利用运行时(runtime)字典转模型

    现在的ios开发中,我们通常会使用MVC模式.当我们拿到数据的时候,我们要把数据转成模型使用. 一般情况我们拿到的数据都是字典.这是我们就需要将字典转成模型对象了. 当对象的属性很少的时候,我们可以直 ...

  4. Centos常用命令之:正则表达式

    我们知道,正则表达式可以大大的提高我们的工作效率. 在了解正则表达式之前,我们需要了解,通配符的概念. 在linux中,我们在使用ls这个命令的时候经常会使用下面这种用法 [fuwh@localhos ...

  5. [SDOI2009]HH去散步

    题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢 ...

  6. 小明搬家_NOI导刊2010提高(05)

    题目描述 小明要搬家了,大家都来帮忙. 小明现在住在第N楼,总共K个人要把X个大箱子搬上N楼. 最开始X个箱子都在1楼,但是经过一段混乱的搬运已经乱掉了.最后大家发现这样混乱地搬运过程效率太低了,于是 ...

  7. ●BZOJ 1416 [NOI2006]神奇的口袋

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1416题解: Pòlya瓦罐模型: 给定罐子里每种颜色的球的个数A[i],按题目要求随机操作若 ...

  8. 习题 7-2 uva225(回溯)

    题意:从(0.0)点出发,第一次走一步……第k次走k步,且每次必须转90度,不能走重复的点.求k次后回到出发点的所有情况.按最小字典序从小到大输出. 思路: 把所有坐标+220,保证其是正数,然后搜索 ...

  9. bzoj3309DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1240  Solved: 777[Submit][Statu ...

  10. xx学院学员评优评奖管理系统

    [勤拂拭软件,软件开发,毕业设计,程序作业,论文写作指导:q-[1215714557]  加好友请注明:勤拂拭)] 之前帮助一个军校学生做的一个评优评奖管理系统,该系统主要用于学校学生评优评先使用. ...