我有一个带有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
}
但是我不确定这是否是解决这个问题的棘手方法,而且,我不知道如何强制片段重新加载自身。