使用菜单中的listitems调用AlertDialog

时间:2017-11-02 03:45:56

标签: android android-alertdialog android-menu multiple-choice

我希望点击一个菜单项,然后显示一个警告对话框,可以选择一个或多个要执行某项操作的项目。 我尝试了很多来自不同教程的例子,但没有一个真的适合我的需要。 任务应该从这里开始: main menu with task items

用户从主活动中打开菜单,然后选择要删除类别的项目。

到现在为止,我得到一个这样的警告对话: The alert dialog which pops up

MainActivity的定义如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener,
    AdapterView.OnItemSelectedListener,SearchView.OnQueryTextListener,SearchView.OnCloseListener {

以下是选项菜单的源代码:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.actions, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_clear_all:
            clearDoneItems();
            this.items_adapter.notifyDataSetChanged();
            break;
        case R.id.action_select_all:
            selectAllItems();
            this.items_adapter.notifyDataSetChanged();
            break;

        case R.id.action_delete_done_items:
            deleteDoneItems();
            break;

        case R.id.action_delete_all:
            deleteAllItems();
            break;

        case R.id.action_add_category:
            add_category("");
            break;
        case R.id.action_delete_category:
            del_category();
            break;
    }
    return super.onOptionsItemSelected(item);
}

这是我调用删除一个或多个所选项目的当前方法:

    public void del_category() {
    LayoutInflater li = LayoutInflater.from(MainActivity.this);
    View dialogView = li.inflate(android.R.layout.select_dialog_multichoice, null);

/* wb, 31Oct2017: preparation for list in delete categories */
    final ArrayList<Integer> sList = new ArrayList<Integer>();
    String[] delCats = new String[list_categories.size()];
    boolean iCount[] = new boolean[delCats.length];
    String msg ="";
    for (int i = 0; i == list_categories.size(); i++) {
        if (!list_categories.get(i).getSpinnerCategory().equals(" PLEASE SELECT A CATEGORY"))
        {delCats[i] = list_categories.get(i).getSpinnerCategory();}
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(dialogView)
            .setTitle("Delete categories")
            .setMessage("Please select categories to be deleted")
            .setMultiChoiceItems(delCats, iCount, new DialogInterface.OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface arg0, int arg1, boolean arg2) {
                            if (arg2) {
                                sList.add(arg1);
                            } else if (sList.contains(arg1)) {
                                // if the item is already selected then remove it
                                sList.remove(Integer.valueOf(arg1));
                            }
                        }
                    }
            )
            .setCancelable(false)
            .setPositiveButton
                    (
                            "Yes", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Toast.makeText(MainActivity.this, "So far", Toast.LENGTH_SHORT).show();
                                }
                            }
                    )
            .setNegativeButton
                    ("No", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Toast.makeText(MainActivity.this, "No Option Selected", Toast.LENGTH_SHORT).show();
                                }
                            }
                    );
    //Creating dialog box
    AlertDialog dialog  = builder.create();
    dialog.show();
}

我对android编程很新,所以我猜不是所有的都做得很好。我先解释一下我在这里做的一些特别的事情:

我填写列表的原因&#34; delCats []&#34;是原始来源(&#34; list_categories&#34;),从xml文件保存的所有类别都是从我称为&#34; CategoryTask.java&#34;的类中定义的。但是&#34; builder.setMultiChoiceItems()&#34; -method将不接受第一个参数的这种类型。因此,我使用循环将类别接管到列表&#34; delCats&#34;。

第一项类别(&#34;请选择...&#34;)不会接管。它不是真正的类别,只是存在,因为用户在保存之前应该强制为项目选择正确的类别。

我希望这里有人能告诉我我犯了什么错误以及为什么我没有看到任何带有正确复选框的类别。我甚至无法点击要查看的一个复选框。

在调试会话期间,我可以看到delCat中的所有项都可用,并且复选框的所有值都设置为&#34; false&#34;在布尔数组中&#34; icount&#34;。

非常感谢Andreas

编辑: 我改变了for循环。你可以看到&#34; delCats&#39;和&#34; iCount&#34;已经填写了正确的方式。但结果仍然没有变化: enter image description here

编辑2: 我没有看到方法中的for循环有问题。即使我将其更改为评论到我的帖子的建议,应用程序也会崩溃。

我已经通过上面的屏幕截图显示了它: 循环现在工作正常,并且delCat和iCount的值已正确填充。所以问题在于另一部分。 enter image description here

调试显示app.show()时应用程序崩溃;声明。 另一个有趣的事情:如果我使用一个字符串数组,我在运行时填写了使用for-loop和delCats,我能够创建一个警报。 所以我想类型必须不同,但我不知道为什么。输出不是我想看到的。它只是一个列表,但没有复选框,我只能点击一个项目。 using a manual filled string array

所以你看到仍有一些问题,但我仍然没有找到解决办法。

1 个答案:

答案 0 :(得分:0)

我建议您使用适配器中的列表并将列表设置为项而不是setMultiChoiceItems。

创建一个alertDialog并在其中添加listItem。

 AlertDialog.Builder alertBuilder = new AlertDialog.Builder(MainActivity.this);
 alertBuilder.setTitle("Select A Item ");
 alertBuilder.setItems(delCats, new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
         String selectedText= Arrays.asList(value).get(which);
      }
 });

AlertDialog dialog = alertBuilder.create();
dialog.show();

修改: 看到代码很明显,循环字符串数组是错误的。i == list_categories.size()使循环只运行一次,除第一个之外不添加项。

for (int i = 0; i == list_categories.size(); i++)

i == list_categories.size()更改为

for (int i = 0; i <= list_categories.size(); i++)

编辑2:您的代码问题又是for循环。循环使索引超出范围。您应该使用

  for (int i = 0; i <= list_categories.size(); i++)

OR

   for (int i = 0; i < list_categories.size()-1; i++)

循环始终从0开始,因为我从零开始,但它将指向arraylist的第一项。对于i=list_categories.size(),索引将脱离arraylist并抛出索引超出键错误。所以更改它到list_categories.size()-1