Android 编程 - 使用警告对话框以编程方式更改按钮文本

Android Programming - Changing Button Text Programmatically with Alert Dialog

我正在尝试创建一个用于编辑吉他谱的应用程序。我有一组代表音品的按钮,我希望能够单击按钮打开一个警告对话框,将该按钮的文本设置为输入的数字。

下面的 editFret 函数由按钮通过其 onClick 属性 调用。当我 运行 这个时,我可以按下一个按钮,它会弹出对话框,我可以输入数字。在对话框中按 OK 后,按钮变为空白。当我再次单击该按钮或任何其他按钮时,该数字将显示为按钮中的文本。它还会不断将之后单击的任何按钮中的文本更改为最后一个输入值。

我尝试在单击时将按钮文本更改为常量值,但没有遇到任何问题,所以我假设问题出在 getFret 函数上,尽管我看不到它会是什么只是获取一个字符串。

//Create string to store the fret number
String fret;

public void getFret(){
    //Create text input field
    final EditText input = new EditText(this);
    input.setInputType(InputType.TYPE_CLASS_NUMBER);
    input.setFilters(new InputFilter[] {new InputFilter.LengthFilter(2)});

    new AlertDialog.Builder(this)
            .setTitle("Edit fret")
            .setMessage("Input fret number")
            .setView(input)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    fret = input.getText().toString();
                }
            })
            .setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Do nothing
                }
            }).show();
}

public void editFret(View view){
    Button button = (Button) view;
    getFret();
    button.setText(fret);
    button.invalidate();  //Don't know if this is necessary
}

您应该在用户单击 AlertDialog 中的“确定” 时设置值。这是如何

new AlertDialog.Builder(this)
            .setTitle("Edit fret")
            .setMessage("Input fret number")
            .setView(input)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    fret = input.getText().toString();
                    //TODO: HERE SET THE BUTTON VIEW AND TEXT TO IT
                    Button button = (Button) findViewById(R.id.button); // This line
                    button.setText(fret); // And this line
                }
            })
            .setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Do nothing
                }
            }).show();

点击AlertDialog确定时设置文本!

也许在您的方法中设置文本是多余的方法。您最好只使用此方法来调用 AlertDialog

public void editFret(View view){
    //Button button = (Button) view;
    getFret();
    //button.setText(fret);
    //button.invalidate();  //Don't know if this is necessary
}

希望它有用或让我知道,干杯

您需要将 setPositiveButton 更改为:

.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    fret = input.getText().toString();
                    button.setText(fret);
                }
            })

并将 Button 更改为全局变量而不是局部变量。

这里的问题是,当您调用 editFret(View view) 时,它还会调用 getFret() 来显示对话框,然后调用 button.setText(fret) 而无需等待用户按下 OK 或取消所以调用OnClickListener时需要设置文本。