2016-05-23 61 views
0

我的問題如下:創建新片段後,第一個片段的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); 
    } 
} 

回答

0

這個問題的答案是:使用getChildFragmentManager() TabbedPagerAdapter。

我正在使用Activity的getSupportFragmentManager(),當你使用NestedED片段時,如TabbedFragment中有一個ViewPager,而ViewPager裏面有(子)碎片。

0

下創建片段的菜單項沒有下活動, 看到前面的討論 Android Options Menu in Fragment

+0

我試過了,但我得到了同樣的結果。問題在於,不管怎樣,當在backstack中返回並在此之後創建新的片段對象時,工具欄菜單中的更新/保存選項不會被破壞,並且看起來它永久地連接到創建的第一個片段。 – ravenns

相關問題