替换AppCompatActivity中的片段

时间:2018-09-09 13:27:45

标签: android android-fragments appcompatactivity

我有一个带有SlideMenu的Android应用。

这是MainActivity的大部分内容,其中有sideMenu:

public class MainActivity extends ActionBarActivity
{
    private ActionBarDrawerToggle sideMenuToggle;
    private DrawerLayout sideMenuLayout;
    private SideMenuAdapter mAdapter;

    ...

    private class DrawerItemClickListener implements ListView.OnItemClickListener 
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        {
            Bundle data = new Bundle();
            data.putString("title", options.get(posit).getString("visual_name"));
            if(posit == Constants.INDEX_USERNAME)
                goToView(ViewManager.EDITPROFILE, data);
            else if((posit >= Constants.INDEX_SECTION_1) && (posit <= Constants.INDEX_SECTION_5)) 
            {
                Bundle category = options.get(posit);
                data.putString("title", category.getString("visual_name"));
                data.putString("visual_name", category.getString("visual_name"));
                data.putString("name", category.getString("name"));
                data.putInt("photo", category.getInt("photo"));
                data.putInt("ico", category.getInt("cat_ico"));
                data.putBoolean("is_root", true);
                goToView(ViewManager.CATEGORYFRAGMENT, data);
            }
        }
    }

    public Fragment goToView(ViewInfo _viewInfo, Bundle bundle)
    {
        try 
        {
            if((this != null) && !this.isFinishing())
            {
                ViewManager myVMgr = viewMgr;
                return myVMgr.show(_viewInfo, bundle, false);
            }

        } catch (IllegalStateException e) {
        }
        return null;
    }
}

这是ViewManager的大部分代码,我在这些代码之间进行切换(它们是片段):

public class ViewManager 
{

    private Activity context = null;

    ...

    public Fragment show(ViewInfo _newFragInfo, Bundle _data,  boolean back)
    {
        Fragment currentFragment = null;
        Fragment newFragment = null;

        final FragmentManager fm = context.getFragmentManager();
        ViewInfo _lastFragInfo = lastViewData != null ? lastViewData.getViewInfo() : null;

        // In this app we must support changing between same fragment class
        //if((_lastFragInfo != null) && _newFragInfo.getIdView().equalsIgnoreCase(_lastFragInfo.getIdView())) {
        //    return null;
        //}

        FragmentTransaction ft = fm.beginTransaction();
        if(_newFragInfo.getIsRoot())
        {
            Iterator<ViewData> iter = viewStack.iterator();
            ViewData viewData;
            while (iter.hasNext())
            {
                viewData = iter.next();
                if(!viewData.getViewInfo().getIsRoot())
                {
                    currentFragment = fm.findFragmentByTag(viewData.getViewInfo().getIdView());
                    if (currentFragment != null)
                    {
                        ft.remove(currentFragment);
                    }
                }
                iter.remove();
            }
        }

        // Hide current fragment
        if (_lastFragInfo != null)
        {
            currentFragment = fm.findFragmentByTag(_lastFragInfo.getIdView());
            if (currentFragment != null)
            {
                if(!back)
                    ft.detach(currentFragment);
                else
                    ft.remove(currentFragment);
            }
        }

        // Show new fragment
        if (_newFragInfo != null)
        {
            if(_newFragInfo.getIsRoot() || back) // only tabs are reusable fragment
                newFragment = fm.findFragmentByTag(_newFragInfo.getIdView());
            if (newFragment == null)
            {
                newFragment = Fragment.instantiate(context, _newFragInfo.getClaseView().getName());
                ft.add(R.id.frame_content, newFragment, _newFragInfo.getIdView());
            }
            else
            {
                ft.attach(newFragment);
            }

            if(_data == null)
                _data = new Bundle(1);

            if(!_data.containsKey("title"))
                _data.putString("title", context.getResources().getString(_newFragInfo.getTitle()));

            if(!_newFragInfo.getIsRoot() && !back)
            {
                viewStack.add(lastViewData);
            }

            ((BaseFragment)newFragment).setData(_data);
        }

        lastViewData = new ViewData(_newFragInfo, _data);
        ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
        ft.commitAllowingStateLoss();
        fm.executePendingTransactions();
        return newFragment;
    }
}

在sideMenu中,“编辑配置文件”选项具有其自己的片段,第1到第5节使用相同的片段,但是我加载了不同的内容。

到目前为止,此方法运行良好,当用户打开侧面菜单并在各个部分之间切换时,它们已正确加载。

但是现在我上传了我的代码以使用目标sdk 26,但由于ActionBarActivity不再可用,因此无法编译,因此我进行了以下更改:

public class MainActivity extends ActionBarActivity

对此

public class MainActivity extends AppCompatActivity

和ViewManager内

private Activity context = null;

对此

private AppCompatActivity context = null;

现在可以编译,但是当我在各节之间切换时,新节的数据没有加载,我一直在观察上一节的内容。

一些例子:

1)

1.1)我选择了Section1(我看到了Section1的内容)

1.2)选择“编辑配置文件”(我看到了“编辑配置文件”的内容)

1.3)我选择了Section3(我看到了Section3的内容)

2)

2.1)我选择了Section1(我看到了Section1的内容)

2.2)我选择了Section3(我看不到Section3的内容,但是看到了Section1的内容)。

对此进行检查,我发现问题是因为使用AppCompatActivity时,我的CategoryFragment的onCreate,onCreateView和onResume方法在步骤1.1、1.3和2.1中被调用,但在步骤2.2中未被调用。

我想念什么吗?我是否应该进行新的更改,以便使用AppCompatActivity正确执行Fragments事务?

-编辑-

Fragment的setData方法是这样的:

public void setData(Bundle _newdata)
{
    data = _newdata;
}

我已经考虑将其更改为此:

public void setData(Bundle _newdata)
{
    data = _newdata;
    // Some code to force the refresh/reloading of the Fragment
}

但是我不确定这是否是解决这个问题的棘手方法,而且,我不知道如何强制片段重新加载自身。

0 个答案:

没有答案