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 的生命周期方法?

答:Fragment 类中定义了 11 个方法,覆盖了 Fragment 生命周期的每一个环节:

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

3. Fragment 和 Activity 生命周期对比图?

答:

Fragment 和 Activity 生命周期对比图

4. 【笔试题】手写一个创建 Fragment 的 Demo?

答:

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. Fragment 和 Activity 之间怎样通信?

答:

  • 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 布局。
-------------本文结束感谢您的阅读-------------