Fragment面试详解

Android 在 Android 3.0(API 级别 11)中引入了Fragment,主要是为了给大屏幕(如平板电脑)上更加动态和灵活的 UI 设计提供支持。

Fragment 表示 Activity 中的行为或用户界面部分。您可以将多个Fragment组合在一个 Activity 中来构建多窗格 UI,以及在多个 Activity 中重复使用某个Fragment。您可以将Fragment视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除Fragment(有点像您可以在不同 Activity 中重复使用的“子 Activity”)。
大家之所以愿意使用fragment的原因主要是因为fragment相比activity更节省内存同事ui的切换想过也更为舒适!

Fragment为什么被称为adnroid第5大组件?

1.Fragment为什么被称为adnroid第5大组件?

android中有4大组件,Activity, service,content provider,broadcast receiver!
而Fragment的使用频率仅次于Activity,有的项目中Fragment使用频率比Activity还要高,并且它有自己的生命周期,所以,很多人称它为“Android第五大组件”

2.Fragment加载到activity的2种方式

  • 静态加载 添加fragment标签到activity的xml布局中
/**
 * Author tyl
 * Created  on 2019/12/26  21:09
 * Describe:静态fragment使用演示
 * 步骤:
 * 1.继承fragment重写onCreateView()回调方法,设置Fragment布局
 * 2.在activity中生命Fragment 使用方式与view相同
 *
 * 实现效果:
 * 2个fragment构成activity布局 一个是标题fragment 一个是内容fragment
 */
public class StaticFragmentActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉默认标题栏
        setContentView(R.layout.activity_static);
    }
}
//xml:



    

    


  • 动态加载
/**
 * Author tyl
 * Created  on 2019/12/26  21:17
 * Describe:静态fragment使用演示
 *
 * 实现效果:
 * 2个fragment构成activity布局 一个是标题fragment 一个是内容fragment
 */
public class DynamicFragmentActivity extends Activity implements fragmentLister {

    private TitleFragment titleFragment;
    private ContentFragment contentFragment;
    private TextView tv_info;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉默认标题栏

        setContentView(R.layout.activity_dynaminc);

        titleFragment = new TitleFragment();
        contentFragment = new ContentFragment();

        //1.创建fragment管理器对象
        FragmentManager fragmentManager = getFragmentManager();
        // 2.获取fragment的事务对象并开启事务
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        //3.调用事务中相应的动态操作fragment的方法执行 add(动态添加的布局位置,要添加的fragment)

        //通过bandl可以向fragment传值
        Bundle bundle = new Bundle();
        bundle.putString("value","activity向fragment传值");
        contentFragment.setArguments(bundle);

        fragmentTransaction.add(R.id.rl_title,titleFragment);
        fragmentTransaction.add(R.id.rl_content,contentFragment);
//        fragmentTransaction.remove()//传入需要移除的fragment
//        fragmentTransaction.replace(替换fragment位置的资源id,要替换的fragment对象); 替换fragment
        //4.提交事务
        fragmentTransaction.commit();

        tv_info = findViewById(R.id.tv_info);
    }
    /**
     * 接收从fragment传过来的值
     * */
    @Override
    public void sendMsg(String value) {
        if (!TextUtils.isEmpty(value)) {
            tv_info.setText(value);
        }
    }
}

3.FragmentPageAdapter和FragmentStatePagerAdapter区别

FragmentPageAdapter适用与页面较少的情况
FragmentStatePagerAdapter适用与页面较多的情况

Fragment生命周期

Fragment面试详解_第1张图片
fragment结合activity的生命周期

Fragment之间的通信

  1. 在fragment中调用activity的方法 getActivity()获取activity对象
  2. 在activity中调用fragment的方法 通过接口回调的方式。
  3. 在fragment中调用fragment的方法findFragmentById获取到activity的其他的fragment对象

你可能感兴趣的:(Fragment面试详解)