Android Fragment使用详解

Fragment生命周期


onAttach(Activity):当Fragment和Activity发生关联时使用

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

onActivityCreate(Bundle):当Activity的onCreate方法返回时调用

onDestoryView():与onCreateView相对应,当该Fragment的视图被移除时调用

onDetach():与onAttach相对应,当Fragment与Activity关联被取消时调用

基本生命周期:onCreate(),onCreateView(),onDestroy(),onDestroyView(),onPause(),onStop(),onResume(),onStart().


FragmentTransaction

 FragmentManager manager=getSupportFragmentManager();//创建FragmentManager对象
 FragmentTransaction transaction=manager.beginTransaction();//创建FragmentTransaction对象
 transaction.add() 
 //往Activity中添加一个Fragment。
 transaction.remove() 
 //从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
 transaction.replace()
 //使用另一个Fragment替换当前的,如果替换布局则布局会被保留,如果替换Fragment,则之前的Fragment会被销毁。
 transaction.hide()
 //隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,内存被保留
 transaction.show()
 //显示之前隐藏的Fragment,配合transaction.hide()使用。
transaction.commit()
//提交修改
注意:每个FragmentTransaction只能被提交一次,即transaction.commit()只能调用一次。若还需使用则需要重写创建FragmentTransaction。


静态创建Fragment

    在布局中一定要指定Fragment的name,其值为你创建Fagment的全路径。

        <fragment
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/fragment"
        android:name="com.daobao.asus.fragmentdemo.HelloFragment"
        android:layout_gravity="center_horizontal"
        app:layout_constraintTop_toBottomOf="@id/main_remove"/>

五步法替换和移除Fragment(动态创建Fragment)

    如果使用的Fragment继承于V4包下的Fragment则FragmentManager和FragmentTransaction也必须是V4包下的。

public class MainActivity extends AppCompatActivity {
    HelloFragment mFragment;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mFragment = new HelloFragment();

    }

    public void onClick(View view) {
        FragmentManager manager=getSupportFragmentManager();//创建FragmentManager对象
        FragmentTransaction transaction=manager.beginTransaction();//创建FragmentTransaction对象
        switch (view.getId()){
            case R.id.main_replace:
                //五步法替换fragment
                transaction.replace(R.id.main_cl,mFragment);
                transaction.commit();
                break;
            case R.id.main_remove:
                transaction.remove(mFragment);
                transaction.commit();
                break;
        }
    }
}


监听Fragment的生命周期

    在Activity中我们通过FragmentManager来对这个Activity中所有的Fragment生命周期进行监听,其监听的生命周期不用全部复写,只需要重写我们用到的生命周期即可。

/**
     * 在activity内监听fragment的生命周期
     */
    public void setRegisterFragmentLifecycleCallbacks() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
            @Override
            public void onFragmentResumed(FragmentManager fm, Fragment f) {
                super.onFragmentResumed(fm, f);

            
            }

            @Override
            public void onFragmentPaused(FragmentManager fm, Fragment f) {
                super.onFragmentPaused(fm, f);

            }

            @Override
            public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) {
                super.onFragmentCreated(fm, f, savedInstanceState);
            }

            @Override
            public void onFragmentDestroyed(FragmentManager fm, Fragment f) {
                super.onFragmentDestroyed(fm, f);
            }

            @Override
            public void onFragmentAttached(FragmentManager fm, Fragment f, Context context) {
                super.onFragmentAttached(fm, f, context);
            }//还可以添加其他生命周期的监听
        }, false);
    }

Activity与Fragment传递参数

    Activity向Fragement传递参数时推荐使用Fragment.setArguments 传递参数而不建议使用构造方法来传递参数。

 //在Activity中传递参数
HelloFragment mFragment = new HelloFragment();
Bundle bundle = new Bundle();
bundle.putInt("test",1);
mFragment.setArguments(bundle);

//Fragment创建布局时获取参数
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_hello,container,false);
    getArguments().getInt("test",0);
    return rootView;
}


Fragment配合ViewPager使用

public class MainActivity extends AppCompatActivity {
    private ViewPager mViewPager;
    private List<Fragment> fragments;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager = findViewById(R.id.main_viewpager);
        fragments = new ArrayList<>();
        fragments.add(new FirstFragment());
        fragments.add(new SecondFragment());
        fragments.add(new ThirdFragment());
        mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return fragments.get(position);
            }

            @Override
            public int getCount() {
                return fragments.size();
            }
        });
        mViewPager.setOffscreenPageLimit(2);//设置ViewPager预加载页面个数
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38520096/article/details/80872126