我的问题如下:
我有一个包含许多片段的活动。主要活动有三个点"菜单。
当我调用片段时,它有自己的菜单(显示)。
此片段是包含EditText字段和复选框的表单。
当用户更改这些字段中的内容时,然后按"保存"工具栏中的图标,值被收集,并发送到Web服务,并更新。但只是第一次。
返回(工具栏中的后退箭头),然后返回到片段(创建新片段),编辑字段后,按"保存"按钮,表单没有保存/更新。
我调试了它,发现"保存"第二次被调用的按钮实际上是" save"上一个片段的按钮。
editText字段中的值在HashMap中收集。并且此HashMap会更新并在新片段中填充新数据。但是当它调用onOptionsItemSelected()时,来自前一个(或FIRSTST片段)的OLD DATA进入焦点,并且这些数据被保存/更新。
所以,我的问题是:有没有办法从片段中分离菜单项,所以当调用另一个(新)片段并创建它时,它会将自己的菜单选项附加到自身(而不是从有史以来创建的第一个片段?
我使用System.identityHashCode(片段)测试它,当用户编辑" second"片段,哈希码是OK,但是当" save"被调用的哈希码被改为第一个片段的哈希码。
这是FormFragment代码的一部分:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu_main, menu);
int itemId = 0;
for (ActionList menuItem : allData.getActionList()) {
menu.add(1, itemId, itemId, menuItem.getPrompt());
itemId++;
}
inflater.inflate(R.menu.menu_activity, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_favourite) {
if (valuesArray != null) {
((CommInterface) getActivity()).getUpdateList(valuesArray, taskUrl, dataItemId);
return true;
} else {
Toast.makeText(getActivity(), "Not updated!", Toast.LENGTH_SHORT).show();
return true;
}
}
for (ActionList menuName : allData.getActionList()) {
if (item.getTitle().equals(menuName.getPrompt())) {
((CommInterface) getActivity()).formMenuItemSelected(menuName.getActionName(), position);
return true;
}
}
return super.onOptionsItemSelected(item);
}
MainActivity的代码部分:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_choose_instance:
....
case android.R.id.home:
if (height > width) {
getSupportFragmentManager().popBackStack();
toolbarTitles.remove(toolbarTitlesCurrentNumber);
toolbarTitlesCurrentNumber--;
toolbar.setTitle(toolbarTitles.get(toolbarTitlesCurrentNumber));
if (toolbarTitlesCurrentNumber == 0) {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setHomeButtonEnabled(false);
}
} else if (...) {
....
}
default:
return super.onOptionsItemSelected(item);
}
}
答案 0 :(得分:0)
在不在活动下的片段下创建菜单项 见前面的讨论 Android Options Menu in Fragment
答案 1 :(得分:0)
这个问题的答案是:在TabbedPagerAdapter中使用getChildFragmentManager()。
我正在使用Activity的getSupportFragmentManager(),当你使用像TabbedFragment这样的NESTED片段时,这是错误的,它有一个ViewPager,而ViewPager里面有(子)片段。