Android-----Fragment抽取
2015-11-16 19:04
507 查看
提笔写一下自己的成长史.
Android开发神器,什么第三方框架,什么GitHub,这些都是Android的开发神器,但是今天小编给大家分享一个事半功倍的开发神器----------------Android开发中的模板设计模式.
模板设计模式?
模板设计模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.
他就是通过吧不变的行为搬移到超类,去除子类中的重复代码来体现他的优势,它提供了一个很好的代码复用平台.
接下来,进行实战.
How?
前提:我有一个app,功能就是综合,动弹,发现这三个功能,同时每个界面都是一样的,都是由PagerSlidingTabStrip和ViewPager进行的组合.看图:
这就是一个大体的框架.接下来书写代码:
其实父类要做的内容也就这么写.
代码实现:
1.布局
baseFragmentPager:
标题布局:base_viewpager_fragment_tab_item
2.初始化布局给布局添加相应的数据
BaseVpFragment
BaseMyFragementAdapter
这样一个完整的基类就被抽取出来了.
运行测试:
Moving_BaseVpFragment
看效果,抽取基类,子类只需要几行代码就可以实现轻松搞定一个小功能.完全体现到了封装,继承的好处了.好好消化,继续小编的发现......
Android开发神器,什么第三方框架,什么GitHub,这些都是Android的开发神器,但是今天小编给大家分享一个事半功倍的开发神器----------------Android开发中的模板设计模式.
模板设计模式?
模板设计模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.
他就是通过吧不变的行为搬移到超类,去除子类中的重复代码来体现他的优势,它提供了一个很好的代码复用平台.
接下来,进行实战.
How?
前提:我有一个app,功能就是综合,动弹,发现这三个功能,同时每个界面都是一样的,都是由PagerSlidingTabStrip和ViewPager进行的组合.看图:
这就是一个大体的框架.接下来书写代码:
其实父类要做的内容也就这么写.
代码实现:
1.布局
baseFragmentPager:
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical" > <!--导航栏 --> <com.itheima.oschina.widget.PagerSlidingTabStrip android:id="@+id/pager_tabstrip" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/sliding_tab_strip_background" app:allowWidthFull="true" app:slidingBlock="@drawable/image_sliding_block" ></com.itheima.oschina.widget.PagerSlidingTabStrip> <android.support.v4.view.ViewPager android:id="@+id/pager" style="@style/fill_fill" > </android.support.v4.view.ViewPager> </LinearLayout></span>
标题布局:base_viewpager_fragment_tab_item
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <!-- 滑动导航条item --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center" > <TextView android:id="@+id/tab_title" style="@style/viewpage_slidingTabTitle" android:layout_centerInParent="true" android:paddingBottom="@dimen/space_10" android:paddingLeft="@dimen/space_16" android:paddingRight="@dimen/space_16" android:paddingTop="@dimen/space_10" android:text="最新资讯" /> <TextView android:id="@+id/tab_mes" android:layout_width="15dp" android:layout_height="15dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="5dp" android:layout_marginRight="13dp" android:gravity="center" android:visibility="visible" /> </RelativeLayout></span>
2.初始化布局给布局添加相应的数据
BaseVpFragment
package com.itheima.oschina.base; <span style="font-size:18px;">import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import butterknife.ButterKnife; import butterknife.InjectView; import com.itheima.oschina.R; import com.itheima.oschina.adapter.BaseMyFragmentAdapter; import com.itheima.oschina.widget.PagerSlidingTabStrip; /** * Fragment的基类 * @author 雪 * */ public abstract class BaseVpFragment extends Fragment { /** * 初始化控件 */ @InjectView(R.id.pager_tabstrip) PagerSlidingTabStrip meTabstrip; @InjectView(R.id.pager) ViewPager mViewPager; private BaseMyFragmentAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //加载布局 return inflater.inflate(R.layout.basefragmentpager, null); } // 在createView之后做ViewCreate来初始化控件的操作 @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.inject(this, view); //给Viewpager 设置内容 adapter = new BaseMyFragmentAdapter(getChildFragmentManager(),meTabstrip,mViewPager,getActivity()); setUpdataAdapter(adapter); } /** * 更新adapter * @param adapter */ public abstract void setUpdataAdapter(BaseMyFragmentAdapter adapter); }</span>
BaseMyFragementAdapter
<span style="font-size:18px;">package com.itheima.oschina.adapter; import java.util.ArrayList; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.TextView; import com.itheima.oschina.R; import com.itheima.oschina.widget.PagerSlidingTabStrip; /** * 抽取FragmentStatePagerAdapter的基类,也是要添加的viewpager数据 * @author 雪宝宝 * */ public class BaseMyFragmentAdapter extends FragmentStatePagerAdapter { //自己定义一个list,装载 ArrayList<Fragment> fragments=new ArrayList<Fragment>(); ArrayList<Bundle> bundles=new ArrayList<Bundle>(); private final PagerSlidingTabStrip tabStrip; private final Context context; public BaseMyFragmentAdapter(FragmentManager fm, PagerSlidingTabStrip meTabstrip,ViewPager viewPager,Context context) { super(fm); tabStrip = meTabstrip; this.context = context; //给Viewpager添加数据 viewPager.setAdapter(this); //关联指示器和Viewpager,让viewpager滑动的时候指示器可以跟着进行滚动,点击的时候可以跳转到相应的viewpager中 meTabstrip.setViewPager(viewPager); } /** * 封装,给list集合中添加元素 * 给指示器添加头布局,和添加标题数据 * @param title * @param fragment */ public void addFragment(String title,Fragment fragment,Bundle bundle){ //给TabStrip中添加布局和头文件中的内容 View tabView=View.inflate(context, R.layout.base_viewpage_fragment_tab_item, null); TextView tv=(TextView) tabView.findViewById(R.id.tab_title); tv.setText(title); tabStrip.addTab(tabView); bundles.add(bundle); //给Viewpager中添加数据 fragments.add(fragment); notifyDataSetChanged(); } @Override public Fragment getItem(int position) { // TODO Auto-generated method stub //省去的步骤就是 // BaseFragment fragment=(BaseFragment) fragments.get(position) // fragment.setArguments(bundles.get(position)); return Fragment.instantiate(context, fragments.get(position).getClass().getName(), bundles.get(position)); } @Override public int getCount() { // TODO Auto-generated method stub return fragments.size(); } }</span>
这样一个完整的基类就被抽取出来了.
运行测试:
Moving_BaseVpFragment
<span style="font-size:18px;">package com.itheima.oschina.fragment; import android.os.Bundle; import com.itheima.oschina.R; import com.itheima.oschina.adapter.BaseMyFragmentAdapter; import com.itheima.oschina.base.BaseVpFragment; public class Moving_BaseVpFragment extends BaseVpFragment { @Override public void setUpdataAdapter(BaseMyFragmentAdapter adapter) { //获取标头 String[] string = getResources().getStringArray(R.array.tweets_viewpage_arrays); //参数一:添加标题,参数二:给Moving这个Fragment中添加Fragment,参数三:Bundle,负责传递数据给Fragment adapter.addFragment(string[0], new MovingListViewFragment(), new Bundle()); adapter.addFragment(string[1], new MovingListViewFragment(), new Bundle()); adapter.addFragment(string[2], new MovingListViewFragment(), new Bundle()); } }</span>
看效果,抽取基类,子类只需要几行代码就可以实现轻松搞定一个小功能.完全体现到了封装,继承的好处了.好好消化,继续小编的发现......
相关文章推荐
- Android 实现QQ侧滑界面之实现
- Android:Service进程间相互通信: Messenger(系列4)
- Android布局
- ubuntu创建wifi热点(android可识别)
- android自定义之 5.0 风格progressBar
- Android 文件相关总结
- 说明一下这两天碰到的android环境的问题
- 关于android service的个人理解
- Android中常被利用的漏洞
- 命令行修改Android系统时间
- android 分辨率自适应
- Android数据库ORMlite框架
- Androids识别带验证码的短信
- android集成 任务调度 cron4j
- android:json解析库
- android hal学习——编写hal代码
- Android开源项目
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android实现自定义带文字和图片的Button
- Android 百度自动更新(升级)SDK的流程简介