BAT大咖助力Android面试2-Fragment面试详解

    • 二,Fragment面试详解
      • 1,Fragment为什么会被称为第五大组件
      • 2,Fragment加载到Activity的两种方式
      • 3,FragmentPagerAdapter与FragmentStatePagerAdapter(源码分析)
      • 4,Fragment生命周期
      • 5,Fragment通信
      • 6,Fragment部分方法

二,Fragment面试详解

1,Fragment为什么会被称为第五大组件

Fragment有自己的生命周期,但是不能独立使用,要加载到activity中使用。
优点
(1)fragment相比activity更节省内存。
(2)能动态灵活的加载到Activity中去配合viewpager使用,UI切换更方便舒适。

2,Fragment加载到Activity的两种方式

(1)静态加载,fragment作为标签加载到activity的布局文件中

    <fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

(2)动态加载

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    DemoFragment fragment = new DemoFragment();
    fragmentTransaction.add(R.id.content, fragment);//容器资源作为标志位,把fragment添加到对应的位置
    fragmentTransaction.addToBackStack("DemoFragment");
    fragmentTransaction.commit();

3,FragmentPagerAdapter与FragmentStatePagerAdapter(源码分析)

FragmentPagerAdapter适用于页面较少的情况

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
            + " v=" + ((Fragment)object).getView());
    mCurTransaction.detach((Fragment)object);
}

FragmentStatePagerAdapter适用于页面较多的情况,每次切换回收内存

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    Fragment fragment = (Fragment) object;

    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
            + " v=" + ((Fragment)object).getView());
    while (mSavedState.size() <= position) {
        mSavedState.add(null);
    }
    mSavedState.set(position, fragment.isAdded()
            ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
    mFragments.set(position, null);

    mCurTransaction.remove(fragment);
}

4,Fragment生命周期


参考自:https://blog.csdn.net/i_wait_for_you/article/details/70240075
https://www.cnblogs.com/LangZXG/p/6501839.html
https://blog.csdn.net/superjunjin/article/details/44783279

由于Fragment依赖Activity的存在而存在,故在创建时Activity生命周期中的方法均先于Fragment生命周期中的方法执行;相反,在销毁时,是先执行Fragment生命周期中的方法再执行Activity生命周期中的方法。

5,Fragment通信

在Fragment中调用Activity中的方法 getActivity
在Fragment中调用Fragment中的方法 接口回调
在Fragment中调用Fragment中的方法 findFragmentById
在Fragment间利用广播

参考自 https://blog.csdn.net/u012702547/article/details/49786417

6,Fragment部分方法

参考自 https://blog.csdn.net/harvic880925/article/details/44927375(详细清晰 写的太棒了)

add:添加Fragment,置于栈顶
replace:替换Fragment,清空对应容器Fragment,置于栈顶
remove:移除Fragment,显示下层Fragment
addToBackStack:添加事务到回退栈,置于栈顶
popBackStack:将最上层的事务弹出回退栈(根据具体参数,可以回退到对应的事务)

Fragment回滚以事务(FragmentTransaction)为单位,一个事务可能包含一个或多个Fragment

Fragment拓展阅读
Fragment全解析系列(一):那些年踩过的坑
Square:从今天开始抛弃Fragment吧!

你可能感兴趣的:(android,面试)