上一篇博客介绍了如何解决Fragment重叠的问题,有需要的同学可以看一下,底部有demo下载。
直通车:完美解决Fragment重叠

本篇博客我们来说一下怎么让fragment重新加载布局资源文件。以及要注意的问题。

首先来说一下为什么有这个需求。

比如,我有这么一个页面,如下图

fragment清除页面数据(重新加载布局)-LMLPHP

该页面要填写一大堆数据,然后点击提交会把当前页面的数据提交到服务器,提交完成后我想把当前页面已填写的数据给清除掉。怎么办呢?

最笨的方法就是,我找到每个控件,然后赋个空值,不过这样也太麻烦了点,而且也不好维护。

简单点的办法就是,当我提交完成后,先把该fragment移除掉,然后重新创建加载一遍,这样一来,页面的数据就回到初始状态了。

需要注意的是要处理好fragment的移除和添加显示操作,避免出现重叠的bug

在fragment中调用一下父activity中的reLoadFragView()方法


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.submit:
                /*模拟提交成功后  重新加载布局*/

                 MainActivity activity= (MainActivity) getActivity();
                activity.reLoadFragView();
                break;
        }

        return super.onOptionsItemSelected(item);
    }

MainActivity中现将fragment移除,然后重新添加显示即可。

     /*重新加载布局*/
    public void reLoadFragView(){
        /*现将该fragment从fragmentList移除*/
        if (fragmentList.contains(dashboardFragment)){
            fragmentList.remove(dashboardFragment);
        }
        /*从FragmentManager中移除*/
        getSupportFragmentManager().beginTransaction().remove(dashboardFragment).commit();

        /*重新创建*/
        dashboardFragment=new DashboardFragment();
        /*添加到fragmentList*/
        fragmentList.add(dashboardFragment);

        /*显示*/
        showFragment(dashboardFragment,DASHBOARD_FRAGMENT_KEY);

    }

需要注意的是,如果报Can not perform this action after onSaveInstanceState这个错误的话,就把commit更改为commitAllowingStateLoss即可。

fragment清除页面数据(重新加载布局)-LMLPHP

效果图:

fragment清除页面数据(重新加载布局)-LMLPHP


下面是demo,希望能帮到你。

demo


如果你觉得本文对你有帮助,麻烦动动手指顶一下,算是对本文的一个认可,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

03-27 05:32