2010-10-07 54 views
0

我花了一個多星期的時間試圖找出一種方法來做一個有限多選擇偏好列表。我沒有嘗試過的作品。如果看似簡單的事情如此艱難,我準備放棄Android。我一直在編程很長一段時間,不記得被這樣的事情打得這麼糟糕。我必須假設我不瞭解一些基本的東西。我希望有人能指出我正確的方向。Android:onPrepareDialogBu​​ilder,onClick&setItemChecked

這是我能想到的最簡單的代碼,應該可以工作。即使設置爲false,它也不會清除複選框,我也嘗試過。爲什麼這不起作用?如果這不起作用,會發生什麼?

任何幫助將不勝感激。

@Override 
    protected void onPrepareDialogBuilder(Builder builder) 
    { 
    CharSequence[] entries = getEntries(); 
    CharSequence[] entryValues = getEntryValues(); 

     if (entries == null || entryValues == null || entries.length != entryValues.length) { 
      throw new IllegalStateException(
        "ListPreference requires an entries array and an entryValues array which are both the same length"); 
     } 

     // Added by WJT since we are loading the entries values after instantiation 
     // we need the clicked indexes to be setup now, they would not have been 
     // set up in the constructor 
     if ((mClickedDialogEntryIndices == null) || (mClickedDialogEntryIndices.length == 0)) 
     mClickedDialogEntryIndices = new boolean[getEntries().length]; 

     restoreCheckedEntries(); 
     builder.setMultiChoiceItems(entries, mClickedDialogEntryIndices, 
       new DialogInterface.OnMultiChoiceClickListener() 
     { 
    public void onClick(DialogInterface dialog, int which, boolean val) 
    { 
    mDlg = (AlertDialog)getDialog(); 
       mListView = (ListView)mDlg.getListView(); 
    if (val) 
      { 
       if (mSelectedCount < mLimit) 
       { 
       mClickedDialogEntryIndices[which] = val; 
        mSelectedCount++; 

       } 
       else 
       { 
        mListView.setItemChecked(which, false); 
       Toast.makeText(getContext(), 
       R.string.newsLimitExceededMessage, 
       Toast.LENGTH_LONG).show(); 

       } // (mSelectedCount < mLimit) 

      } 
      else 
      { 
       mClickedDialogEntryIndices[which] = val; 
       mSelectedCount--; 

      } // (val) 

    } // void onClick(DialogInterface dialog, int which, boolean val) 


     }); // DialogInterface.OnMultiChoiceClickListener() 

    } // void onPrepareDialogBuilder(Builder builder) 

感謝,

\ ^/-111

+0

什麼,確切地說,是「一個有限的多選擇偏好列表」?什麼,特別是,不工作?你期望的行爲是什麼?你有沒有考慮過使用'Dialog'爲主題的'Activity',你有更多的靈活性? – CommonsWare 2010-10-07 22:20:58

+0

@CommonsWare:我試圖完成的是一個首選項,它允許用戶從預先定義的列表中選擇多個項目。我想限制選擇這些項目的數量。我的首選是在達到限制時禁用所有未選定的項目,並保持所選項目的啓用。我會解決爲每個複選框超過限制與消息給用戶。 – 2010-10-08 19:46:13

+0

@CommonsWare:我試圖建立一個ListView,當我嘗試將它附加到Preferences子系統時,它將執行這個主要部分,但沒有成功。這與我對單獨的活動有所接近。 在上面的代碼中,我只是試圖取消選中一個超出預設的允許複選框限制的複選框。它不會取消選中複選框。 – 2010-10-08 19:48:46

回答

0

下面我將如何處理這個問題:

第1步:獲取一個獨立的一次性測試活動這方面的工作。忘記偏好。忘記對話框。只關注具有CHOICE_MODE_MULTIPLEListView的功能,其中,在檢查了一定數量的項目之後,未檢查的項目被禁用。

步驟#2:以自定義窗口小部件的形式獲取步驟#1中的功能。通過這個,我的意思是你會實現一個子類ListView(我猜...可能是一些容器,如果它比ListView更多的話)可以烘烤第一步所需的所有東西。

步驟3:創建一個自定義DialogPreference子類,它使用步驟#2中的自定義小部件。

例如,here is a sample project其中我有一個自定義ColorMixer小部件,捲成ColorPreference

+0

謝謝,有一次我開始使用您的混色器樣品。我會回到這樣的事情,看看我是否有更多的成功。感謝您的輸入! – 2010-10-08 21:03:58

+0

感謝您幫助我解決這個問題並重新開始。遵循你的步驟幫助我達到了工作的地步。這不是完美的,但它正在工作,現在這已經足夠好了。 :) – 2010-10-12 19:42:59

相關問題