java - Alertdialog.Builder 的 setItems() onClick 返回空对话框

标签 java android android-alertdialog

我正在制作一个自定义的 Alertdialog.Builder,并冒昧地扩展了 danoz73 所做的工作,可以在此处找到 https://github.com/danoz73/QustomDialog

我在类QustomDialogBu​​ilder.java(AlertDialog.Builder的子类)中实现了我自己的setItems()方法。由于我传递的项目不是标准的,因此该方法NOT标记为Override

    public QustomDialogBuilder setItems(ArrayList<KMColor> items, final DialogInterface.OnClickListener listener) {
    LinearLayout itemList = (LinearLayout) mDialogView.findViewById(R.id.items_list);//INFLATE THE LINEARLAYOUT INSIDE THE SCROLLVIEW
    Log.i("TAG","1 setItems items dialog is "+mDialog);//<--THIS IS NULL

    //HIDE UNUSED VIEWS SO THERE ISN'T A SPACE
    mDialogView.findViewById(R.id.customPanel).setVisibility(View.GONE);
    mDialogView.findViewById(R.id.contentPanel).setVisibility(View.GONE);

    for (int i = 0; i < items.size(); i++) {
        KMColor item = items.get(i);

        View listItem = inflateItem(item.name,item.color);
        listItem.setId(item.color);//VIEWS IDS CAN'T BE 0
        itemList.addView(listItem);
        Log.i("TAG","2 setItems items dialog is "+mDialog);//<--THIS IS NULL

        if (listener != null) {
            /*itemList <-- doesn't tell you what item was clicked*/
            listItem.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("TAG","3 setItems items dialog is "+mDialog);//<--STILL NULL 
                    listener.onClick(mDialog, v.getId());
                }
            });
        }
    }
    return this;
}

Custom Dialog with setItems()

一切正常,我得到了我想要显示的自定义对话框。但是当我选择一个项目时,我得到了 id,但是从 onClick 返回的对话框为空,所以我无法关闭该对话框!

        alert.setItems(items,new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Log.i("TAG", "setItems dialog is " + dialog);//<--null, so I crash if I try to dismiss()

        }
    });

回到QustomDialogBu​​ilder.java,这里是我用来抓取对话框的显示覆盖。

    @Override
public AlertDialog show() {
    if (mTitle.getText().equals("")) mDialogView.findViewById(R.id.topPanel).setVisibility(View.GONE);
    if (mMessage.getText().equals("")) mDialogView.findViewById(R.id.contentPanel).setVisibility(View.GONE);
    mDialog = super.show();//<--GET THE DIALOG TO PASS IN THE ONCLICK

    Log.i("TAG","AlertDialog show()  dialog is "+ mDialog);
    return mDialog;
}

我确信我可以以不同的方式获取对对话框的引用,但是我真的很想了解为什么这没有按照我期望的方式停止工作。如果我能得到任何帮助,我将不胜感激。谢谢!

编辑这是我构建对话框的方式

public void showColorPicker(){

    QustomDialogBuilder alert = new QustomDialogBuilder(context);
    alert.setTitle("Pick Color");
    alert.setTitleColorWithResource(getResources().getColor(R.color.white));
    alert.setDividerColorWithResource(getResources().getColor(R.color.white));


    ArrayList<KMColor> items = new ArrayList<KMColor>();
    items.add(new KMColor("Black",Color.BLACK));
    items.add(new KMColor("Blue",Color.BLUE));
    items.add(new KMColor("Cyan",Color.CYAN));
    items.add(new KMColor("Green",Color.GREEN));
    items.add(new KMColor("Dark Grey",Color.DKGRAY));
    items.add(new KMColor("Light Grey",Color.LTGRAY));
    items.add(new KMColor("Magenta",Color.MAGENTA));
    items.add(new KMColor("Red",Color.RED));
    items.add(new KMColor("White",Color.WHITE));
    items.add(new KMColor("Yellow",Color.YELLOW));

    alert.setItems(items,new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Log.i("TAG", "setItems dialog is " + dialog);//<--NULL

        }
    });
    alert.setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,int id) {
            // if this button is clicked, just close
            // the dialog box and do nothing
            dialog.cancel();//<--WORKS FINE
        }
    });
    // create alert dialog
    AlertDialog alertDialog = alert.create();
    // show it
    alertDialog.show();
}

最佳答案

不好意思地说我找到了答案。我的问题就在这里

 // create alert dialog
AlertDialog alertDialog = alert.create();
// show it
alertDialog.show();

我正在打电话create()在我的 Alertdialog.Builder 上,但我不是 Override荷兰国际集团create()QustomDialogBuilder.java ,我只是Override荷兰国际集团show()因此我从来没有掌握过这个对话框!简单修复!上面的代码现在只是

alert.show();

我现在也是Override create()QustomDialogBuilder.java 。与 show() 相同但现在我不会不小心追我的尾部了!

    @Override
public AlertDialog create() {
    if (mTitle.getText().equals("")) mDialogView.findViewById(R.id.topPanel).setVisibility(View.GONE);
    if (mMessage.getText().equals("")) mDialogView.findViewById(R.id.contentPanel).setVisibility(View.GONE);
    mDialog = super.create();
    return mDialog;
}

关于java - Alertdialog.Builder 的 setItems() onClick 返回空对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24165290/

相关文章:

java - 在测试期间注入(inject)@Autowired 私有(private)字段

Android AlertDialog 不显示

android - Alertdialog 在 android 中创建异常

java - 正确的布局可根据每种屏幕尺寸灵活设置 JFrame 和 JInternalFrame

java - 在 Java 限定类型中有注释 tmesis/inside 的目的是什么?

java - Android VoIP通话实现

Android 帐户管理 - 如何创建不同类型的帐户?

android - 如何读取本地 xml 文件是资源文件夹作为 android 中的输入流?

android - 无法开始 fragment 交易

Android AlertDialog.Builder 和软键盘