美文网首页
Fragment的多种使用方法及其简述

Fragment的多种使用方法及其简述

作者: 君袅 | 来源:发表于2019-02-24 23:08 被阅读0次

简述:

image

方法的作用

onAttach()
当Fragment与Activity发生关联时调用。
onCreate()
当创建Fragment实例时,系统回调的方法。在该方法中,需要对一些必要的组件进行初始化,以保证这个组件的实例在Fragment处于pause或stop状态时仍然存在。
onCreateView()
当第一次在Fragment上绘制UI时,系统回调的方法。该方法返回一个View对象,该对象表示Fragment的根视图;若Fragment不需要展示视图,则该方法可以返回null。
onActivityCreated()
当Activity的onCreate()返回时调用。
onStart()
onResume()
onPause()
当用户离开Fragment时回调的方法(并不意味着该Fragment被销毁)。在该方法中,可以对Fragment的数据信息做一些持久化的保存工作,因为用户可能不再返回这个Fragment。
onShop()
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用。
onDestory()
当Fragment销毁时调用。
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用。

优点

Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。
Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
Fragment 解决Activity间的切换不流畅,轻量切换。
Fragment 替代TabActivity做导航,性能更好。
Fragment 在4.2.版本中新增嵌套fragmeng使用方法,能够生成更好的界面效果。
Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能

使用

用按钮切换

            private void initView() {
            A = (Button) findViewById(R.id.A);
            B = (Button) findViewById(R.id.B);
            C = (Button) findViewById(R.id.C);

            A.setOnClickListener(this);
            B.setOnClickListener(this);
            C.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.A:
                    //1.创建待添加的fragment页面
                    LeftFragment leftFragment = new LeftFragment();
                    replaceFragment(leftFragment);

                    break;
                case R.id.B:
                    //1.创建待添加的fragment页面
                    RightFragment rightFragment = new RightFragment();
                    replaceFragment(rightFragment);

                    break;
                case R.id.C:
                    //1.创建待添加的fragment页面
                    AFragment aFragment = new AFragment();
                    replaceFragment(aFragment);

                    break;
            }
        }

        private void replaceFragment(Fragment fragment) {
            //2.获取管理器类
            FragmentManager manager = getSupportFragmentManager();
            //3.开启事物
            FragmentTransaction transaction = manager.beginTransaction();
            //4.添加或替换
            transaction.replace(R.id.content,fragment);
            //5.提交事物
            transaction.commit();       
        }

2.可是一层一层倒退的(有个的add增加,hide隐藏,show实现的结合)

                    FragmentManager manager = getSupportFragmentManager();
                    FragmentTransaction transaction = manager.beginTransaction();
                    //隐藏所有页面
                    if (aFragment!=null){
                        transaction.hide(aFragment);
                    }
                    if (bFragment!=null){
                        transaction.hide(bFragment);
                    }
                    switch (v.getId()) {
                        case R.id.btn1:
                            if (aFragment == null){//判断为空,创建页面,添加页面
                                aFragment = new AFragment();
                                transaction.add(R.id.fl,aFragment);
                            }else{//判断不为空、显示页面
                                transaction.show(aFragment);
                            }
                            break;
                        case R.id.btn2:
                            if (bFragment== null){//判断为空,创建页面,添加页面
                                bFragment = new BFragment();
                                transaction.add(R.id.fl,bFragment);
                            }else{//判断不为空、显示页面
                                transaction.show(bFragment);
                            }
                            break;
                    }
                    transaction.addToBackStack(null);//回退栈
                    transaction.commit();

3.在activity中直接获取到fragment中控件(静,动态)

                       private void initView() {
                            mBta = (Button) findViewById(R.id.bta);
                            mBta.setOnClickListener(this);

                            //寻找动态的fragment并赋予帧布局中
                            FragmentManager manager = getSupportFragmentManager();
                            FragmentTransaction transaction = manager.beginTransaction();
                            AFragment aFragment = new AFragment();
                            transaction.replace(R.id.content,aFragment,"aa");
                            transaction.commit();
                        }

                        @Override
                        public void onClick(View v) {
                            switch (v.getId()) {
                                default:
                                    break;
                                case R.id.bta:
                    //                Activity获取Fragment对象(静态方式)
                    //                Fragment fragmentById =getSupportFragmentManager().findFragmentById(R.id.fm);  //在xml中的fragment的id           
                    //                View view = fragmentById.getView();///获取Fragment中的根View控件
                    //                Button viewById = view.findViewById(R.id.f);//通过View获取按钮控件
                    //                viewById.setText("Activity获取Fragment对象(静态方式)");



                                    Fragment aa = getSupportFragmentManager().findFragmentByTag("aa");
                                    View view = aa.getView();
                                    Button button = view.findViewById(R.id.f);
                                    button.setText("Activity获取Fragment对象(动态方式)");
                                    
                                    break;
                            }
                        }   

4.在fragment中直接更改activity中的控件

                FragmentActivity activity = getActivity(); //Fragment获取Activirty对象
                Button button = activity.findViewById(R.id.btnA);//通过activity获取控件
                button.setText("Fragment获取Activirty对象");//设置控件内容        

5.activity-fragment的穿值方法

                 1.在创建之前传
                       //第一种:用过有参构造
                            fragment:
                                    
                                        private String name;
                                        private int age;

                                        @SuppressLint("ValidFragment")
                                        public AFragment(String name, int age) {
                                            this.name = name;
                                            this.age = age;
                                        }                       
                            activity:
                                        FragmentManager manager = getSupportFragmentManager();
                                        FragmentTransaction transaction = manager.beginTransaction();
                                        //第一种:用过有参构造
                                        AFragment  fragment = new AFragment("赵龙", 19);
                                        transaction.replace(R.id.content, aFragment);
                                        transaction.commit();
                        //第二种:用bundle
                            activity:
                            
                                        FragmentManager manager = getSupportFragmentManager();
                                        FragmentTransaction transaction = manager.beginTransaction();
                                        //第二种:用bundle
                                        Bundle bundle = new Bundle();
                                        bundle.putString("name","小明");
                                        bundle.putString("age","90");
                                        AFragment aFragment = new AFragment();
                                        aFragment.setArguments(bundle);
                                        transaction.replace(R.id.content, aFragment);
                                        transaction.commit();
                            fragment:
                            
                                        Bundle arguments = getArguments();
                                        String name = arguments.getString("name");
                                        String age = arguments.getString("age");
                                        mAbt.setText(name+":"+age);                         
                                        
                                        
                
                 2.在创建之后传
                            activity:
                                      aFragment.setName("熊大",12);
                        
                            fragment:
                                        创建set方法                          
                                        //给已有的改变
                                        public void setName(String name,int age) {
                                            mAbt.setText(name+":"+age);
                                        }

6.fragment-activity的穿值方法

                fragment:
                            //1.定义接口
                            private AA aa;

                            public void setAa(AA aa) {
                                this.aa = aa;
                            }

                            public interface AA{
                                void send(String name,String age);
                            }
                
    
    
                            //3.接口回调
                               if(aa!=null){
                                     aa.send("dsa","dasdas");
                                 }
                 activity:
                         
                        //2.传递对象实现接口重写方法
                        blankFragment.setSendDataToActivity(this);
             
                       //接口回调数据刷新
                        @Override
                        public void send(String str1, String str2) {
                            btnA.setText(str1+":"+str2);
                        }

7.使用ViewPager绑定静态fragment

                private TabLayout tab;
                private ViewPager vp;
                private ArrayList<Fragment> list;
                private ArrayList<String> title;
                private MyFragmentAdapter adapter;

                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main5);
                    initView();
                }

                private void initView() {
                    tab = (TabLayout) findViewById(R.id.tab);
                    vp = (ViewPager) findViewById(R.id.vp);

                    list = new ArrayList<>();
                    list.add(new AFragment());
                    list.add(new BFragment());
                    list.add(new CFragment());

                    title = new ArrayList<>();
                    title.add("新闻");
                    title.add("娱乐");
                    title.add("汽车");

                    adapter = new MyFragmentAdapter(getSupportFragmentManager(),list,title);
                    vp.setAdapter(adapter);

    //(静态绑定)tab与vp设置页面绑定
            tab.setupWithViewPager(vp);
         
                
                    <android.support.design.widget.TabLayout
                        android:layout_width="match_parent"
                        android:layout_height="30dp"
                        app:tabMode="scrollable"
                        android:id="@+id/tab"
                        app:tabMaxWidth="0dp"
                        >
                    </android.support.design.widget.TabLayout>

                配置器 继承 extends FragmentPagerAdapter

8使用ViewPager绑定动态fragment (复用)

                public class MainActivity extends AppCompatActivity {
                private TabLayout tab;
                private ViewPager vp;
                private ArrayList<Fragment> list;
                private MyFragmentAdapter adapter;

                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    initView();
                }

                private void initView() {
                    tab = (TabLayout) findViewById(R.id.tab);
                    vp = (ViewPager) findViewById(R.id.vp);

                    list = new ArrayList<>();
                    for (int i = 0; i < 20; i++) {
                        //创建ViewPager中Fragment
                        list.add(new BlankFragment("内容"+i));
                        //创建TabLayout中的显示标题
                        tab.addTab(tab.newTab().setText("标题"+i));
                    }

                    //适配器
                    adapter = new MyFragmentAdapter(getSupportFragmentManager(),list);
                    vp.setAdapter(adapter);

                    //相互绑定
                    tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {//通过选择对应的tab,切换vp的位置
                        @Override
                        public void onTabSelected(TabLayout.Tab tab) {
                            vp.setCurrentItem(tab.getPosition());
                        }
                        @Override
                        public void onTabUnselected(TabLayout.Tab tab) {
                        }
                        @Override
                        public void onTabReselected(TabLayout.Tab tab) {
                        }
                    });
                    vp.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab));//通过vp的滑动,选择tab的位置
                }
            }

fragment与单选按钮的绑定

            /**
                 * 初始化主页面ViewPager+Fragment+RadioGroup
                 */
                private void initViewPager() {

                    //数据源
                    list = new ArrayList<>();
                    list.add(new HomeFragment());
                    list.add(new HomeFragment());
                    list.add(new HomeFragment());
                    list.add(new HomeFragment());
                    list.add(new HomeFragment());

                    //适配器
                    adapter = new MyMainPagerAdapter(getSupportFragmentManager(),list);
                    vp.setAdapter(adapter);

                    //设置默认选中页面
                    rg.check(R.id.home);
                    vp.setCurrentItem(0);

                    //相互关联
                    rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                        @Override
                        public void onCheckedChanged(RadioGroup group, int checkedId) {
                            switch (checkedId){
                                case R.id.home:
                                    vp.setCurrentItem(0);
                                    break;
                                case R.id.knowledge:
                                    vp.setCurrentItem(1);
                                    break;
                                case R.id.navigation:
                                    vp.setCurrentItem(2);
                                    break;
                                case R.id.project:
                                    vp.setCurrentItem(3);
                                    break;
                                case R.id.me:
                                    vp.setCurrentItem(4);
                                    break;
                            }
                        }
                    });

                    vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                        @Override
                        public void onPageScrolled(int i, float v, int i1) {

                        }

                        @Override
                        public void onPageSelected(int position) {
                            switch (position){
                                case 0:
                                    rg.check(R.id.home);
                                    break;
                                case 1:
                                    rg.check(R.id.knowledge);
                                    break;
                                case 2:
                                    rg.check(R.id.navigation);
                                    break;
                                case 3:
                                    rg.check(R.id.project);
                                    break;
                                case 4:
                                    rg.check(R.id.me);
                                    break;

                            }
                        }

                        @Override
                        public void onPageScrollStateChanged(int i) {

                        }
                    });
                }

fragment的嵌套

           if (msg.what == 0x001){
                String str = (String) msg.obj;

                //数据解析
                Gson gson = new Gson();
                ProjectTabBean projectTabBean = gson.fromJson(str, ProjectTabBean.class);

                //数据判断
                if (projectTabBean!=null&&projectTabBean.getData()!=null){

                    list = new ArrayList<>();//创建数据源

                    List<ProjectTabBean.DataBean> data = projectTabBean.getData();

                    //循环添加页面、tab栏
                    for (int i = 0; i < data.size(); i++) {
                        list.add(new ProjectListFragment(data.get(i).getId()+""));//创建Fragment

                        tab.addTab(tab.newTab().setText(data.get(i).getName()));//创建Tab
                    }

                    //设置适配器
1主要是这个  //Fragment嵌套使用getChildFragmentManager()/进行管理切换
                    adapter = new MyProjectPageAdapter(getChildFragmentManager(),list);
                    vp.setAdapter(adapter);

                    //相互关联
                    tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                        @Override
                        public void onTabSelected(TabLayout.Tab tab) {
                            vp.setCurrentItem(tab.getPosition());
                        }

                        @Override
                        public void onTabUnselected(TabLayout.Tab tab) {

                        }

                        @Override
                        public void onTabReselected(TabLayout.Tab tab) {

                        }
                    });

                    vp.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab));
                }

            }
        }   

fragment的切换(隐藏现实)

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private Toolbar toobar;
    private FrameLayout fl;
    private LinearLayout ll;
    private NavigationView na;
    private DrawerLayout Dl;

    private int Type = 0;
    private int WANANDROID = 0;
    private int SHOUCHANG = 1;
    private int SHEZHI = 2;
    private int GUANYU = 3;
    private FragmentManager manager;
    private ArrayList<Fragment> list;
    private TextView title;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        toobar = (Toolbar) findViewById(R.id.toobar);
        fl = (FrameLayout) findViewById(R.id.fl);
        ll = (LinearLayout) findViewById(R.id.ll);
        na = (NavigationView) findViewById(R.id.na);
        Dl = (DrawerLayout) findViewById(R.id.Dl);
        title = (TextView) findViewById(R.id.title);

        na.setItemIconTintList(null);
        na.setNavigationItemSelectedListener(this);

        initcehua();
        initFragments();

        manager = getSupportFragmentManager();
        initMoRen();


    }

    private void initMoRen() {
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(R.id.fl, list.get(0));
        transaction.commit();
    }

    private void initFragments() {
        list = new ArrayList<>();
        list.add(new wan_fragment());
        list.add(new shou_Fragment());
        list.add(new she_Fragment());
        list.add(new guan_Fragment());

    }

    private void initcehua() {
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, Dl, toobar, R.string.app_name, R.string.app_name);
        Dl.addDrawerListener(toggle);
        toggle.syncState();
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.A:
                SwicheFragemnt(WANANDROID);
                break;
            case R.id.B:
                SwicheFragemnt(SHOUCHANG);
                break;
            case R.id.C:
                SwicheFragemnt(SHEZHI);
                break;
            case R.id.D:
                SwicheFragemnt(GUANYU);
                break;
        }
        Dl.closeDrawer(Gravity.LEFT);
        return true;
    }
    /**
     * 切换碎片
     * @param type ,除了是类型外,还是 position
     */
    private void SwicheFragemnt(int type) {
        FragmentTransaction transaction = manager.beginTransaction();
        Fragment fragment = list.get(type);
        //fragment是否有添加过
        if (!fragment.isAdded()){
            transaction.add(R.id.fl, fragment);
        }

        //隐藏上一个碎片
        Fragment lastFragment = list.get(Type);
        transaction.hide(lastFragment);
        //显示碎片
        transaction.show(fragment);
        transaction.commit();

        //切换完成之后,当前的fragmnet就是下一次切换要隐藏的Fragmnet
        Type = type;
    }
}

布局使用的帧布局

相关文章

网友评论

      本文标题:Fragment的多种使用方法及其简述

      本文链接:https://www.haomeiwen.com/subject/mtsiyqtx.html