创建新片段后,将保留第一个片段中的HashMap值

时间:2016-05-23 12:20:35

标签: android menu fragment

我的问题如下:

我有一个包含许多片段的活动。主要活动有三个点"菜单。

当我调用片段时,它有自己的菜单(显示)。

此片段是包含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);
    }
}

2 个答案:

答案 0 :(得分:0)

在不在活动下的片段下创建菜单项 见前面的讨论 Android Options Menu in Fragment

答案 1 :(得分:0)

这个问题的答案是:在TabbedPagerAdapter中使用getChildFragmentManager()。

我正在使用Activity的getSupportFragmentManager(),当你使用像TabbedFragment这样的NESTED片段时,这是错误的,它有一个ViewPager,而ViewPager里面有(子)片段。