我试图根据之前的输入提示用户输入。
请允许我澄清并补充一些背景:
这个应用程序是一个骰子滚动模拟器。主要活动显示每个骰子上的骰子数量和边数,通过从菜单中打开子活动来更改。此子活动使用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
,而不是等待对话完成。但是这没有多大意义,因为调用对话框的活动是为结果调用的。
答案 0 :(得分:1)
在Android对话框中异步。您无法显示它并期望您的代码在此处等待。你做的是dialog.show()
,然后立即exitActivity()
,所以看起来它的工作方式就像你做的那样。
修改强>
您的代码的快速修复可能是替换此部分:
} else {
result = tmpResult;
}
exitActivity(true);
与
} else {
result = tmpResult;
exitActivity(true);
}
因为exitActivity()
导致你出现问题。