Android:onPrepareDialogBu​​ilder,onClick& setItemChecked

时间:2010-10-07 20:09:52

标签: android android-preferences

我花了一个多星期的时间试图找出一种方法来进行有限多选择偏好列表。我没有尝试过任何工作。如果看似简单的事情如此艰难,我准备放弃Android。我已经编程了很长时间,不记得被这样的事情严重打败了。我必须假设我不理解一些基本的东西。我希望有人能指出我正确的方向。

这是我能想到的最简单的代码。即使将其设置为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) 

谢谢,

\ ^ /我l

1 个答案:

答案 0 :(得分:0)

以下是我如何解决问题:

步骤#1:让它在独立的一次性测试活动中运行。忘记偏好。忘记对话框。只关注具有CHOICE_MODE_MULTIPLE ListView的功能,其中在检查了一定数量的项目后,未经检查的项目将被禁用。

步骤2:以自定义小部件的形式获取步骤#1中的功能。通过这个,我的意思是你将实现一个ListView的子类(我猜......如果有更多的容器,可能是一个容器,而不是ListView)从步骤#中获取所需的所有内容1。

步骤3:创建一个使用步骤2中自定义小部件的自定义DialogPreference子类。

例如,here is a sample project我有一个自定义ColorMixer窗口小部件,汇总到ColorPreference