2013-07-02 26 views
2

我有一個奇怪的問題,包含多個片段的ViewPager。每個片段顯示一個包含多個可能答案的問題(複選框)。當複選框狀態發生變化時,它的值將存儲在散列映射中,以便如果用戶使用ViewPager滑動並再次返回,則可以恢復每個複選框的選中/未選中狀態。ViewPager內部片段錯誤設置狀態

在onCreateView()

ViewGroup answersRow = (ViewGroup) view.findViewById(R.id.answers_row); 

    //loop over each answer and add a checkbox 
    for(Answer answer : answers) { 
     View answerView = inflater.inflate(R.layout.view_answer, null); 

     final CheckBox answerCheckButton = (CheckBox) answerView.findViewById(R.id.answerCheckButton); 

     //set correct value for answer based on datamodel 
     String tagName = "Q" + question.getNumber() + "A" + answer.getNumber(); 
     Integer answerValue = getDataModel().getAnswer(tagName); 
     boolean isChecked = (answerValue != null && answerValue > 0); 
     System.out.println("answer " + answerCheckButton.getTag() + " " + isChecked); 

     answerCheckButton.setTag(tagName); 
     answerCheckButton.setChecked(isChecked); 
     answerCheckButton.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       System.out.println("onCheckedChanged " + buttonView.getTag() + " " + isChecked); 
       String answerTag = (String) buttonView.getTag(); 
       Integer answerValue = isChecked ? 1 : 0; 
       getDataModel().setAnswer(answerTag, answerValue); 
      } 
     }); 
     answersRow.addView(answerView); 
    } 

我會忽略佈局文件,因爲它們是微不足道的。該應用程序工作正常時,分段之間的分頁和點擊複選框。數據模型正確更新。

問題出現當我這樣做:

  1. 選擇複選框,這樣就變成了「檢查」
  2. 移動兩頁遠(使原來的片段被破壞)
  3. 回遷原始片段位置以便重新創建。

會發生什麼情況是:狀態正確地從我的數據模型設置(即以「檢查」),但隨後立即後續調用發生在onCheckedChanged和複選框被設置不正確(即以「未登記」)。有趣的是,它總是獲取列表中最後一個複選框的值。

就好像Android是試圖記住的複選框的狀態,並自動設置它們,而是因爲它們都具有相同的ID(正在從XML膨脹),它只是採取從最後一個複選框值列表。我不使用onSaveInstanceState或類似的東西,所以我不明白爲什麼複選框被自動重置。我可以通過這種方式阻止Android更改我的複選框狀態嗎?

換言之,步驟1(選擇複選框),我看到

07-02 14:42:07.334: I/System.out(21487): onCheckedChanged Q4A1 true 

但在步驟3 I看到(後最初被設置爲 「true」,從數據模型)

07-02 14:42:10.474: I/System.out(21487): onCheckedChanged Q4A1 false 

......這個改變立即發生,沒有點擊複選框。

任何幫助表示讚賞。

+0

您確定對模型所做的更改在步驟1之後是否仍然存在? –

回答

4

a。嘗試在CheckBox上撥打setSaveEnabled(false);

b。嘗試添加:

answerCheckButton.setOnCheckedChangeListener(null); 

answerCheckButton.setChecked(isChecked); 

然後添加新的監聽器。

+1

我已經嘗試在檢查狀態(你的(b)選項)後添加監聽器,但無濟於事。 setSaveEnabled選項很有趣,我會試試看。我曾假設,除非您明確實施代碼,否則任何狀態都不會被保存。 我實際上找到了一個解決方法,因爲我貼:通過將監聽器和setChecked代碼放在onStart而不是onCreateView。這有效地覆蓋了Android的任何嘗試狀態更改,因爲我在生命週期的後期設置了狀態。 – Steve

+0

我試過setSaveEnabled(false) - 完美地工作。 感謝您的幫助! – Steve

+0

我有這個EXACT相同的問題,它讓我發瘋,因爲我不知道發生了什麼事!上帝爲你的互聯網人。 –