目录
- 生命周期
- 添加Fragment
- 静态添加
- 动态添加
- 几个常用的Utils
- fragment 传值的问题
一.生命周期
> 我 x@#$@# !!!
乍一看 ,我艹,刚刚把Activity 生命周期理解,又要记这个,MMP,
大兄弟啊,别急,你这么看
这样是不是就感觉 ,很像,其实把,真的就那么像,不知道为啥,很多人都说fragment 是缩小版的Activity,这种说法 我感觉是不对的。,愚见,,以后再扯。。
生命周期说明
onAttach
当Fragment与Activity发生关联时调用。onCreateView
创建该Fragment的视图
- onActivityCreated
当Activity的onCreate方法返回时调用
- onDestoryView
与onCreateView想对应,当该Fragment的视图被移除时调用
- onDetach
与onAttach相对应,当Fragment与Activity关联被取消时调用
> 注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现
肯定有人会觉得 这么说会不会太简单了,
这里有些地方是看下面这么作者的 ,大兄弟们,去吧,哈哈(ps zhy我算是看他的文章成长的,很推荐的一个大牛)
二.添加Fragment
静态添加(不推荐)
自定义类继承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);
}
}
是不是感觉很麻烦,相信我,未来的开发 你基本上都用不到,了解就行了,哈哈
动态添加(推荐)
啥都不用管,也不需要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)
替换某个碎片
项目中常用的手法,第一个当属选项卡的切换了
- 配合
ViewPager
和RadioGroup
实现具有联动作用的选项卡点击即可跳转到代码
三.fragment 传值的问题
Activity 传参数给 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();
}
}
这时候,就有人说了,大兄弟啊 ,这么多代码,写的这么麻烦,
做为开发人员,肯定有办法解决,这么恶心的代码的事情,首先 你要确保你使用的开发工具是 Android Studio ,还在使用 Ecplise 的小伙伴。请看下图
ps 如果有大兄弟找到那个 go home 的图片 请发给我,谢谢
使用 Android Studio 生成 Fragment
然后就好了 ,哈哈,有木有很简单。
Fragment传参数给 Activity
使用接口传递参数
请看第二步的第二个红色框框,是不是还有个没勾选上,这次勾选上,然后就神奇的发现,AS 帮你自动生成好了代码,你只需要实现他的接口就OK了。
写在最后
机智的小伙伴,我要说一下,关于传参数的问题,正在开发中,会使用其他的替代方案,毕竟这样的方式,写起来很繁琐,实际开发中,会使用EventBus,或者其他的事件总线框架代替,这个在后面慢慢补充。