一. Fragment加载到Activity的2种方式
1.静态加载:直接在Activity布局文件中指定Fragment。使用指定属性name即可,代码如下所示:
<fragment
android:id="@+id/myFragment"
android:name="com.liys.fragment.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
注意: 这里必须加个id,不然会报错。
2. 动态加载: 动态加载需要使用到FragmentManager (推荐使用)
(1) .xml布局
<FrameLayout
android:id="@+id/myFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" />
(2) Activity中
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
MyFragment myFragment = new MyFragment();
transaction.add(R.id.myFragment, myFragment);
transaction.commit();
二. Fragment的通信
1. Activity 传值给 Fragment
方法1:直接通过在Activity中的Fragment对象调用里面的方法
Fragment中定义public方法
public void setTitle(String title){
this.mTitle = title;
}
Activity中调用
MyFragment myFragment = new MyFragment();
myFragment.setTitle("value");
方法2:通过Bundle传递
Activity中添加数据
MyFragment myFragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString("key", "value");
myFragment.setArguments(bundle);
Fragment中接收数据
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
//获取数据
Bundle bundle = getArguments();
String str = bundle.getString("key");
View view = inflater.inflate(R.layout.fragment, null);
return view;
}
2. Fragment 传值给 Activity
方法1:通过强转getActivity()
Activity中定义接收值的方法
public void setTitle(String title){
this.mTitle = title;
}
Fragment中
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Activity activity = getActivity();
if(activity instanceof MainActivity){
MainActivity mainActivity = (MainActivity)activity;
mainActivity.setTitle("哈哈");
}
}
缺点:多个Activity调用的时候需要加判断,不然强转会出错。
方法2:通过接口回调的方式
Fragment中定义接口
@SuppressLint("ValidFragment")
public MyFragment(CallBack callBack){
this.mCallBack = callBack;
}
interface CallBack{
void setTitle(String tilte);
}
public void test(){
//开始调用
if(mCallBack != null){
mCallBack.setTitle("haha");
}
}
Activity中 实现这个接口,重写setTitle()
public class MainActivity extends AppCompatActivity implements MyFragment.CallBack {
public void addFragment(){
...
MyFragment myFragment = new MyFragment(this);
...
}
@Override
public void setTitle(String title){
this.mTitle = title;
}
3. Fragment 传值给 Fragment
方法:通过共用的Activity为中介传递
4. 通用方法
- 第三方库,Eventbus。
- 广播
三. Fragment和Activity生命周期的关系
我们先来看一张Google官方的图片:
咋一听,Activity生命周期有七个方法,Fragment生命周期有十一个方法,貌似挺复杂的,其实我们只需要明白到底是谁带领着谁去执行生命周期的方法,就能很快弄明白这个问题。
1.打开应用
Activity | Fragment |
---|---|
onCreate() | onAttach() |
onCreate() | |
onCreateView() | |
onActivityCreated() | |
onStart() | onStart() |
onResume() | onResume() |
2. 按下主屏幕键/锁屏
Activity | Fragment |
---|---|
onPause() | onPause() |
onStop() | onStop() |
3. 重新打开应用
Activity | Fragment |
---|---|
onRestart() | |
onStart() | onStart() |
onResume() | onResume() |
4. 按下后退键
Activity | Fragment |
---|---|
onPause() | onPause() |
onStop() | onStop() |
onDestroy() | onDestroyView() |
onDestroy() | |
onDetach() |