目錄
- 生命周期
- 添加Fragment
- 靜態(tài)添加
- 動態(tài)添加
- 幾個常用的Utils
- fragment 傳值的問題
一.生命周期
> 我 x@#$@# O缡!应媚!
乍一看 猜极,我艸中姜,剛剛把Activity 生命周期理解,又要記這個跟伏,MMP丢胚,
大兄弟啊,別急受扳,你這么看
這樣是不是就感覺 携龟,很像,其實把勘高,真的就那么像峡蟋,不知道為啥,很多人都說fragment 是縮小版的Activity,這種說法 我感覺是不對的华望。蕊蝗,愚見,赖舟,以后再扯匿又。。
生命周期說明
onAttach
當Fragment與Activity發(fā)生關(guān)聯(lián)時調(diào)用建蹄。onCreateView
創(chuàng)建該Fragment的視圖
- onActivityCreated
當Activity的onCreate方法返回時調(diào)用
- onDestoryView
與onCreateView想對應(yīng),當該Fragment的視圖被移除時調(diào)用
- onDetach
與onAttach相對應(yīng)裕偿,當Fragment與Activity關(guān)聯(lián)被取消時調(diào)用
> 注意:除了onCreateView洞慎,其他的所有方法如果你重寫了,必須調(diào)用父類對于該方法的實現(xiàn)
肯定有人會覺得 這么說會不會太簡單了嘿棘,
這里有些地方是看下面這么作者的 劲腿,大兄弟們,去吧鸟妙,哈哈(ps zhy我算是看他的文章成長的焦人,很推薦的一個大牛)
二.添加Fragment
靜態(tài)添加(不推薦)
自定義類繼承Fragment
//import android.support.v4.app.Fragment
public class TestFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_test, container, false);
}
}
在MainActivity的activity_main.xml文件中添加碎片
<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.allens.test.MainActivity">
<!-- 注意是fragment name 和 id 都必須要寫上 -->
<fragment android:name="com.allens.test.fragment.TestFragment" android:id="@+id/test_fragment" android:layout_width="match_parent" android:layout_height="match_parent">
</fragment></linearlayout>
MainActivity繼承FragmentActivity(原版的Activity不支持V4Fragment的加載)
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
是不是感覺很麻煩,相信我重父,未來的開發(fā) 你基本上都用不到花椭,了解就行了,哈哈
動態(tài)添加(推薦)
啥都不用管房午,也不需要FragmentActivity
矿辽,寫好Fragment,直接擼代碼
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
TestFragment fragment = new TestFragment();
transaction.add(R.id.main_ll, fragment);//這里的R.id.main_ll 是容器的id
transaction.commit();
>拓展
remove (Fragment fragment)
刪除某個碎片-
repace(int layoutId,Fragment fragment)
替換某個碎片
竊喜
項目中常用的手法,第一個當屬選項卡的切換了
配合
RadioGroup
實現(xiàn)選項卡點擊即可跳轉(zhuǎn)到代碼配合
ViewPager
和TabLayout
實現(xiàn)具有聯(lián)動作用的選項卡點擊即可跳轉(zhuǎn)到代碼
- 配合
ViewPager
和RadioGroup
實現(xiàn)具有聯(lián)動作用的選項卡點擊即可跳轉(zhuǎn)到代碼
三.fragment 傳值的問題
Activity 傳參數(shù)給 Fragment
fragment中寫法
public class DataFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
public DataFragment() {
}
public static DataFragment newInstance(String param1, String param2) {
DataFragment fragment = new DataFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_data, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.e("TAG","DATA1--->" + mParam1);
Log.e("TAG","DATA2--->" + mParam2);
}
}
Activity中寫法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.main_ll, DataFragment.newInstance("data1","data2"));
transaction.commit();
}
}
這時候袋倔,就有人說了雕蔽,大兄弟啊 ,這么多代碼宾娜,寫的這么麻煩批狐,
做為開發(fā)人員,肯定有辦法解決前塔,這么惡心的代碼的事情嚣艇,首先 你要確保你使用的開發(fā)工具是 Android Studio ,還在使用 Ecplise 的小伙伴嘱根。請看下圖
ps 如果有大兄弟找到那個 go home 的圖片 請發(fā)給我髓废,謝謝
使用 Android Studio 生成 Fragment
然后就好了 ,哈哈该抒,有木有很簡單慌洪。
Fragment傳參數(shù)給 Activity
使用接口傳遞參數(shù)
請看第二步的第二個紅色框框,是不是還有個沒勾選上凑保,這次勾選上冈爹,然后就神奇的發(fā)現(xiàn),AS 幫你自動生成好了代碼欧引,你只需要實現(xiàn)他的接口就OK了频伤。
寫在最后
機智的小伙伴,我要說一下芝此,關(guān)于傳參數(shù)的問題憋肖,正在開發(fā)中,會使用其他的替代方案婚苹,畢竟這樣的方式岸更,寫起來很繁瑣,實際開發(fā)中膊升,會使用EventBus,或者其他的事件總線框架代替怎炊,這個在后面慢慢補充。