Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android编程-通过警报对话框以编程方式更改按钮文本_Java_Android_Button - Fatal编程技术网

Java Android编程-通过警报对话框以编程方式更改按钮文本

Java Android编程-通过警报对话框以编程方式更改按钮文本,java,android,button,Java,Android,Button,我正在尝试创建一个用于编辑吉他标签的应用程序。我有一个代表FRET的按钮数组,我希望能够单击该按钮打开一个警报对话框,将该按钮的文本设置为输入的数字 按钮通过其onClick属性调用下面的editFret函数。当我运行这个程序时,我可以按下一个按钮,它会弹出对话框,我可以很好地输入数字。但在对话框中按OK后,按钮变为空白。当我再次单击按钮或任何其他按钮时,该数字将显示为按钮中的文本。它还不断地将随后单击的任何按钮中的文本更改为最后的输入值 我尝试在单击时将按钮文本更改为常量值,但没有任何问题,因

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

按钮通过其onClick属性调用下面的editFret函数。当我运行这个程序时,我可以按下一个按钮,它会弹出对话框,我可以很好地输入数字。但在对话框中按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
中单击OK时,应设置值。这是怎么回事

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

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

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

您需要将设置正按钮更改为:

.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    fret = input.getText().toString();
                    button.setText(fret);
                }
            })
并将按钮更改为全局变量,而不是局部变量


这里的问题是,当您调用editFret(视图)时,它还将调用getFret(),显示对话框,然后调用button.setText(fret),而不等待用户按OK或Cancel,因此您需要在调用OnClickListener时设置文本。

其他人已经给出了正确的答案,但我还想补充一点,您应该使用.setNegativeButton(“Cancel”,null),而不是将onclick侦听器设置为不执行任何操作。更简单、更高效。
将按钮更改为全局变量而不是局部变量
是一种不好的方法,因为您必须在活动中只使用一次对象,并且不必在整个活动的生命周期中保留其价值。我同意您的看法,但由于它是一个按钮,我想他也会希望添加onClickListener和其他事情但这只是我自己的假设,就是这样。谢谢你的解释。我只需要按钮是本地的,所以我将它移动到getFret函数中,并将其设置为onClick函数,并且能够完全删除editFret函数。