onClick上没有更新Android按钮文本

时间:2014-01-06 23:03:14

标签: java android xml

尝试从XML中按下onClick()后更改按钮上的文本。 但是文本在方法运行后不会更新,只有在我再次单击按钮后才会更新到新文本。我尝试使用runOnUiThread()运行它,但它的行为相同。谁知道为什么?

代码:

public void setLabel(View v) {
    v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);

    final EditText input = new EditText(this);

    new AlertDialog.Builder(this)
            .setMessage("Add label:")
            .setView(input)
            .setPositiveButton("Set", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    if (input.getText() == null || input.getText().toString().length() == 0) {
                        Toast.makeText(AlarmDialog.this, Html.fromHtml("<i>" + getString(R.string.label_reset) + "<i>"), Toast.LENGTH_SHORT).show();
                        labelSet = false;
                    }
                    else {
                        alarmLabel = input.getText().toString();
                        labelSet = true;
                        Toast.makeText(AlarmDialog.this, Html.fromHtml("<b>" + getString(R.string.label_set) + "<b>"), Toast.LENGTH_SHORT).show();
                    }

                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    Toast.makeText(AlarmDialog.this, Html.fromHtml("<i>" + getString(R.string.label_not_set) + "<i>"), Toast.LENGTH_SHORT).show();
                }
            }).create().show();

    Button button = (Button) v;
    if (labelSet)
        button.setText(R.string.label_set);
    else
        button.setText(R.string.label);
}

XML:

<Button
            android:id="@+id/label_button"
            android:layout_height="fill_parent"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:text="@string/label"
            android:onClick="setLabel"
            style="@android:style/Widget.Holo.Button.Borderless"
            android:padding="8dp"/>

2 个答案:

答案 0 :(得分:2)

我认为问题在于你的

Button button = (Button) v;
if (labelSet)
    button.setText(R.string.label_set);
else
    button.setText(R.string.label);

代码在AlertDialog中输入或单击某些内容之前执行。因为代码就在你说AlertDialog.show()的那一行的正下方。因此,如果您希望之后执行代码,则必须将其添加到onClickListener中。第二次它只能工作,因为在再次点击按钮之前关闭了alertview。你的labelSet变量已经设置好了。

答案 1 :(得分:0)

如果labelSet最初设置为false,那么您第一次点击该按钮时就会...

button.setText(R.string.label);

...将被调用,它不会更新按钮中的文本。

请注意,在 onClick方法运行完成后,您的AlertDialog setLabel方法将被称为(具体来说,点击肯定时会调用它) AlertDialog中的按钮。我相信你所寻找的更像是......

public void setLabel(View v) {
    v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);

    final Button button = (Button) v;
    final EditText input = new EditText(this);

    new AlertDialog.Builder(this)
        .setMessage("Add label:")
        .setView(input)
        .setPositiveButton("Set", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                if (input.getText() == null || input.getText().toString().length() == 0) {
                    Toast.makeText(AlarmDialog.this, Html.fromHtml("<i>" + getString(R.string.label_reset) + "<i>"), Toast.LENGTH_SHORT).show();
                    button.setText(R.string.label);
                }
                else {
                    alarmLabel = input.getText().toString();
                    Toast.makeText(AlarmDialog.this, Html.fromHtml("<b>" + getString(R.string.label_set) + "<b>"), Toast.LENGTH_SHORT).show();
                    button.setText(R.string.label_set);
                }

            }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                Toast.makeText(AlarmDialog.this, Html.fromHtml("<i>" + getString(R.string.label_not_set) + "<i>"), Toast.LENGTH_SHORT).show();
            }
        }).create().show();
}