碎片Fragment(頁面上加入碎片併合理使用的二種方式和生命週期)
阿新 • • 發佈:2018-11-16
一、靜態註冊
佈局檔案中直接放置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分離