Android-----Fragment抽取

提笔写一下自己的成长史.
       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-----Fragment抽取)