基本概念

你可以简单的理解为,Fragment是显示在Activity中的Activity。它可以显示在Activity中,然后它也可以显示出一些内容。因为它拥有自己的生命周期,可以接受处理用户的事件,并且你可以在一个Activity中动态的添加,替换,移除不同的Fragment,因此对于信息的展示具有很大的便利性

Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。

过去support-v4库是一个jar包,24.2.0版本开始,将support-v4库模块化为多个jar包,包含:support-fragment, support-ui, support-media-compat等,这么做是为了减少APK包大小,你需要用哪个模块就引入哪个模块。

如果想引入整个support-v4库,则compile 'com.android.support:support-v4:24.2.1,如果只想引入support-fragment库,则com.android.support:support-fragment:24.2.1

因为support库是不断更新的,因此建议使用support库中的android.support.v4.app.Fragment,而不要用系统自带的android.app.Fragment。而如果要使用support库的Fragment,Activity必须要继承FragmentActivity(AppCompatActivity是FragmentActivity的子类)。

  • Fragment是依赖于Activity的,不能独立存在的。
  • 一个Activity里可以有多个Fragment。
  • 一个Fragment可以被多个Activity重用。
  • Fragment有自己的生命周期,并能接收输入事件。
  • 我们能在Activity运行时动态地添加或删除Fragment。

Fragment优点

  • 模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
  • 可重用(Reusability):多个Activity可以重用一个Fragment。
  • 可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。

Fragment的生命周期

因为Fragment是依附于Activity存在的,因此它的生命周期收到Activity的生命周期影响。Fragment比Activity多了几个生命周期的回调方法。

  • onAttach(Activity): 当Fragment与Activity发生关联的时候调用

  • onCreateView(LayoutInflater, ViewGroup, Bundle): 创建该Fragment的视图

  • onActivityCreated(Bundle): 当Activity的onCreated方法返回时调用

  • onDestroyView() 与onCreateView方法相对应,当该Fragment的视图被移除时调用

  • onDetach() 与onAttach方法相对应,当Fragment与Activity取消关联时调用

PS:注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现

Fragment的创建和使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class FirstFragment extends Fragment {

@Nullable
//创建加载布局文件
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
Log.d("onCreateView","onCreateView被执行");
View view=inflater.inflate(R.layout.activity_first_fragment,container,false);
return view;
}

//布局已经加载完成
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
Log.d("onViewCreated","onViewCreated被执行");
super.onViewCreated(view, savedInstanceState);
//通过view.findViewById(),可以获取fragment控件
}

@Override
public void onDetach() {
super.onDetach();
Log.d("onDetach","onDetach被执行");
}

@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
Log.d("onAttach","onAttach被执行");
}

@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("onDestroyView","onDestroyView被执行");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class FragmentActivity extends AppCompatActivity {
private Button btn_change;
private FirstFragment firstFragment;//创建FirstFragment对象
private SecondFragment secondFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
btn_change=(Button) findViewById(R.id.btn_change);
firstFragment=new FirstFragment();

//在当前的FragmengActivity添加显示fragment
getSupportFragmentManager().beginTransaction().add(R.id.fl,
firstFragment).commitAllowingStateLoss();
//添加点击事件,用来切换不同的Fragment
btn_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(secondFragment==null) {
secondFragment = new SecondFragment();
firstFragment=null;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fl,
secondFragment).addToBackStack(null).commitAllowingStateLoss();
}
});
}

}

要点

什么是Fragment的回退栈?【重要】

  • Fragment的回退栈是用来保存每一次Fragment事务发生的变化
  • 如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存
  • Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。

Fragment与Activity之间的通信【难点】

Fragment依附于Activity存在,因此与Activity之间的通信可以归纳为以下几点:
① 如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法。
② 如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
③ Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。


评论