1. 程式人生 > >碎片Fragment(頁面上加入碎片併合理使用的二種方式和生命週期)

碎片Fragment(頁面上加入碎片併合理使用的二種方式和生命週期)

一、靜態註冊

        佈局檔案中直接放置fragment節點,可被多個佈局檔案同時引用(Logo  廣告等)

        注意:fragment 節點要增加name屬性指定該fragment類的完整路徑

        (一) 建立靜態Fragment

    public class StaticFragment extends Fragment {

         private Context mContext;
         protected  View view;
         @Nullable
         @Override
         public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle                   savedInstanceState) {
        mContext = getActivity();
        view = inflater.inflate(R.layout.item_box,container,false);
        return view;
         }
    }

       (二) XML中引用

   <fragment
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:name="com.example.yejiajia.myapplication.fragment.StaticFragment"/>

        Fragment的oncreate()操作在Activity之前

二、動態註冊配合碎片介面卡FragmentStatePagerAdapter使用Fragment       

        Fragment的oncreate()操作在Activity之後  (適用於啟動引導頁 輪播圖banner)

   (一)    動態fragment頁面

public class DynamicFragment extends Fragment {

    private String mDesc;
    private View view;
    private Context context;
    private int position;
    private String name;

    public  static DynamicFragment newInstance(int position,String name){
        DynamicFragment fragment = new DynamicFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("position",position);
        bundle.putString("name",name);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        context = getActivity();
        if(getArguments() != null)
        {
            position = getArguments().getInt("position");
            name = getArguments().getString("name");
        }
        view = inflater.inflate(R.layout.dynamic_fragment,container,false);
        TextView tv_content = view.findViewById(R.id.tv_content);
        tv_content.setText(name);
        return view;
    }
}

(二)FragmentStatePagerAdapter

public class MobilePagerAdapter extends FragmentStatePagerAdapter {

    private ArrayList<GoodsInfo> mGoodsList = new ArrayList<GoodsInfo>();

    public MobilePagerAdapter(FragmentManager fm, ArrayList<GoodsInfo> list) {
        super(fm);
        mGoodsList = list;
    }

    @Override
    public Fragment getItem(int i) {
        return DynamicFragment.newInstance(i,mGoodsList.get(i).getName());
    }

    @Override
    public int getCount() {
        return mGoodsList.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mGoodsList.get(position).getName();
    }
}

(三)主頁面 

        繼承AppCompatActivity或者FragmentActivity

public class FragmentDynamicActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_dynamic);
        PagerTitleStrip titleStrip = findViewById(R.id.title);
        ViewPager viewPager = findViewById(R.id.vp_content);
        titleStrip.setTextSize(TypedValue.COMPLEX_UNIT_SP,20);
        ArrayList<GoodsInfo> goodsInfoArrayList = GoodsInfo.getDefaultList();
        MobilePagerAdapter adapter = new MobilePagerAdapter(getSupportFragmentManager(),goodsInfoArrayList);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(0);
    }


    /**
     * 翻頁過程中呼叫
     * @param i 當前頁面序號
     * @param v 當前頁面偏移百分比  取值0-1
     * @param i1 當前頁面偏移距離
     */
    @Override
    public void onPageScrolled(int i, float v, int i1) {

    }

    /**
     * 翻到哪一頁
     * @param i
     */
    @Override
    public void onPageSelected(int i) {

    }

    /**
     * 翻頁狀態改變時呼叫  0 靜止 1正在滑動 2滑動完畢  1-2-0
     */
    @Override
    public void onPageScrollStateChanged(int i) {

    }


}

三、Fragment 生命週期  比Activity多了5個生命週期

        onAttach:與Activity結合。可在該方法中例項化Activity的一個回撥物件,在Fragment中呼叫Activity的回撥方法

        onCreateView:建立碎片檢視

        onActivityCreated:在活動頁面建立完畢後呼叫

        onDestroyView:回收碎片檢視

        onDetach:與Activity分離