0%

Android 详解 Fragment

1. 实际开发中应该选择系统内置的 android.app.Fragment 还是 support-v4 库中的 android.support.v4.app.Fragment

  • 应该使用 support-v4 库中的 Fragment
  • 因为它可以让 Fragment 在所有的 Android 系统版本中保持功能一致。比如说Fragment 中嵌套使用 Fragment,这个功能是在 Android 4.2 系统中才开始支持的,如果使用系统内置的 Fragment,程序就会崩溃
  • 不需要在 build.gradle 文件中添加 support-v4 的依赖,因为 build.gradle 文件中已经添加了 appcompat-v7 库的依赖,这个库也会将 support-v4 库一并引入。

2. Fragment 的生命周期方法

  • onAttach(): 当 FragmentActivity 建立关联的时候调用
  • onCreate()
  • onCreateView(): 为 Fragment 创建视图(加载布局)时调用
  • onActivityCreated():确保与 Fragment 相关联的 Activity 一定已经创建完毕的时候调用
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroyView(): 当与 Fragment 关联的视图被移除的时候调用
  • onDestroy()
  • onDetach(): 当 FragmentActivity 解除关联的时候调用

3. Fragment 生命周期图

Fragment

4. 写一个创建 Fragment 的 Demo

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
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
return view;
}

}

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
replaceFragment(new MyFragment());
}

private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
}

5. FragmentActivity 之间怎样通信

  • MyFragment myFragment = getFragmentManager().findFragmentById(R.id.my_fragment);
  • MainActivity mainActivity = (MainActivity) getActivity();

6. Android 中常见的限定符有哪些

  • 大小

    • small:提供给小屏幕设备的资源
    • normal:提供给中等屏幕设备的资源
    • large:提供给大屏幕设备的资源
    • xlarge:提供给超大屏幕设备的资源
  • 分辨率

    • ldpi:提供给低分辨率设备的资源(120dpi 以下)
    • mdpi:提供给中等分辨率设备的资源(120dpi ~ 160dpi)
    • hdpi:提供给高分辨率设备的资源(160dpi ~ 240dpi)
    • xhdpi:提供给超高分辨率设备的资源(240dpi ~ 320dpi)
    • xxhdpi:提供给超超高分辨率设备的资源(320dpi ~ 480dpi)
  • 方向

    • land:提供给横屏设备的资源
    • port:提供给竖屏设备的资源

7. 什么是最小宽度限定符(Smallest-width-Qualifier)

  • 举例,使用 large 限定符,那些屏幕被认为是 large 的设备就会自动加载 layout-large 文件夹(需手动在 res 目录下创建)下的布局,而小屏幕的设备则还是会加载 layout 文件夹下的布局

    • 但有一个问题,large 到底指多大我们并不确定,有时候我们希望可以更加灵活地为不同设备紧挨着布局,不管它们是不是被系统认为为 large,这时就可以使用最小宽度限定符(Smallest-width Qualifier)
  • 最小宽度限定符允许我们对屏幕的宽度指定一个最小值(以 dp)为单位,然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,屏幕宽度小于这个值的设备就加载另一个布局

    • 比如,在 res 目录下新建 layout-sw600dp 文件夹,然后在这个文件夹下新建 activity_main.xml 布局,这就意味着,当程序运行在屏幕宽度大于 600dp 的设备上时,会加载 layout-sw600dp/activity_main 布局;当程序运行在屏幕宽度小于 600dp 的设备上时,则仍然加载默认的 layout/activity_main 布局
-------------------- 本文结束感谢您的阅读 --------------------