0

我正在尝试根据先前的输入提示用户输入。

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

该系统对于像“1d6”、“1d10”等类似的例子运行得非常好,而且不是问题——据我所知

现在,这是我的问题:
我有一个通过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_acceptandroid: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);

}

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

编辑:在阅读了这个问题之后,我开始认为这可能Intent不是在等待对话完成。但这并不完全有意义,因为调用对话框的活动被调用以获得结果。

4

1 回答 1

1

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

编辑

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

} else {
    result = tmpResult;
}

exitActivity(true);

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

因为这exitActivity()是导致您出现问题的原因。

于 2012-12-03T19:32:26.723 回答