我的問題如下:創建新片段後,第一個片段的HashMap值保持調用
我有一個有很多片段的活動。主要活動有「三點」菜單。
當我調用一個片段時,它有它自己的菜單(正在顯示)。
此片段是帶有EditText字段和複選框的表單。
當用戶更改這些字段中的內容,然後按下工具欄中的「保存」圖標時,會收集這些值併發送到Web服務並進行更新。但只有第一次。
返回後(返回工具欄中的箭頭),並返回一個片段(創建新片段)後,編輯字段並按下「保存」按鈕,表單不會被保存/更新。
我調試了一下,發現第二次被調用的「保存」按鈕實際上是前一個片段的「保存」按鈕。
editText字段中的值在HashMap中收集。並且這個HashMap被更新並在新片段中填充新數據。但是當它調用onOptionsItemSelected()時,前一個(或第一個片段)的舊數據進入焦點,並且這些數據被保存/更新。
所以,我的問題是這樣的:有沒有一種方法來分離從片段中的菜單項,所以當另一個(新的)片段被調用,並且被創建它從重視自己的菜單選項,以本身(而不是有史以來第一個片段)?
我使用System.identityHashCode(fragment)測試了它,並且當用戶在「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);
}
}
我試過了,但我得到了同樣的結果。問題在於,不管怎樣,當在backstack中返回並在此之後創建新的片段對象時,工具欄菜單中的更新/保存選項不會被破壞,並且看起來它永久地連接到創建的第一個片段。 – ravenns