ADK - 几乎立即取消/绕过用户提示对话框

时间:2012-12-03 19:16:33

标签: android dialog alertdialog adk

我试图根据之前的输入提示用户输入。

请允许我澄清并补充一些背景:
这个应用程序是一个骰子滚动模拟器。主要活动显示每个骰子上的骰子数量和边数,通过从菜单中打开子活动来更改。此子活动使用startActivityForResult()调用其结果,并完全由RadioGroup和两个按钮 - “接受”和“取消”组成 - 并将String额外传递给主要活动(格式为“XdN” - 例如“1d20”),主要活动然后解析并用于相应地调整骰子数和边数。

此系统非常适用于“1d6”,“1d10”等示例,问题 - 据我所知。< / p>

现在,这是我的问题:
我有一个单选按钮,通过String“自定义”(而不是像“XdN”一样String)。如果选中(最后,当点击“接受”时),我的目的是打开一个对话框并提示用户输入自定义计数值 - 这样就可以了。对话框显示,布局正确,看起来应该如此,但是布局然后在瞬间消失并传递当前计数值而不是输入的值用户。这也会给LogCat(我正在使用Eclipse和ADT)抛出一个错误:

Application            Tag             Text
org.x3chaos.nicedice   WindowManager   Activity org.x3chaos.nicedice.DiceActivity
                                       has leaked window com.android.internal.pol
                                       icy.impl.PhoneWindow$DecorView@44786f20 th
                                       at was originally added here
org.x3chaos.nicedice   WindowManager   android.view.WindowLeaked: Activity org.x3
                                       chaos.nicedice.DiceActivity has leaked win
                                       dow com.android.internal.policy.impl.Phone
                                       Window$DecorView@44786f20 that was origina
                                       ly added here
org.x3chaos.nicedice   WindowManager   at android.view.ViewRoot.<init>(ViewRoot.j
                                       ava:247)

[more if needed]

-

Button button_accept android:onClick方法如下:

public void accept(View view) {

    RadioGroup group = (RadioGroup) findViewById(R.id.dice_radiogrp);
    RadioButton selected = (RadioButton) findViewById(group
            .getCheckedRadioButtonId());
    String tmpResult = selected.getText().toString();

    if (!tmpResult.matches("[0-9|xX](.*)[Dd][0-9](.*)")) {

        // Show dialog

        LayoutInflater li = LayoutInflater.from(this);
        View dialogView = li.inflate(R.layout.prompt_dice, null);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(dialogView);
        builder.setTitle("Custom Dice");
        builder.setCancelable(false);

        final EditText editCount = (EditText) findViewById(R.id.edit_promptDiceCount);
        final EditText editSides = (EditText) findViewById(R.id.edit_promptDiceSides);

        builder.setPositiveButton("Accept", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                boolean flag = false;
                String textCount, textSides;
                textCount = editCount.getText().toString();
                if (textCount.equals("")) {
                    textCount = "1";
                    flag = true;
                }
                textSides = editSides.getText().toString();
                if (textSides.equals("")) {
                    textSides = "20";
                    flag = true;
                }

                int count = Integer.parseInt(textCount);
                int sides = Integer.parseInt(textSides);

                if (count > 20)
                    count = 20;
                if (sides > 20)
                    sides = 20;

                String finRes = count + "d" + sides;

                setResultExtra(finRes);

                if (flag) {
                    String msg = "Invalid input: set dice to " + finRes;
                    Toast toast = Toast.makeText(context, msg,
                            Toast.LENGTH_SHORT);
                    toast.show();
                }

            }

        });

        builder.setNegativeButton("Cancel", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                exitActivity(false);
            }

        });

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

    } else {
        result = tmpResult;
    }

    exitActivity(true);

}

所有其他功能都有效,所以我不确定为什么不这样做。我确定这是我搞乱的事情 - 看到这是我的第一个应用程序,我正在使用一些我以前从未接触过的对象和方法 - 所以我非常感谢任何帮助。 :

编辑:在阅读this question之后,我开始认为可能是Intent,而不是等待对话完成。但是这没有多大意义,因为调用对话框的活动是为结果调用的。

1 个答案:

答案 0 :(得分:1)

在Android对话框中异步。您无法显示它并期望您的代码在此处等待。你做的是dialog.show(),然后立即exitActivity(),所以看起来它的工作方式就像你做的那样。

修改

您的代码的快速修复可能是替换此部分:

} else {
    result = tmpResult;
}

exitActivity(true);

} else {
    result = tmpResult;
    exitActivity(true);
}

因为exitActivity()导致你出现问题。