首页 > 解决方案 > 无法更改预定义的字符串值

问题描述

我正在构建一个录音机应用程序。要存储创建的音频文件,我使用此字符串创建它们来命名它们

`public String inputName = "recorded_audio";`

这是默认的音频剪辑名称,除非用户使用nameBtn

后来我使用另一个字符串作为文件的最终名称

`mediaFileName += "/Files/Recordings/" + inputName + ".mp3";`

我想让用户选择命名他们的文件,而不是使用“recorded_audio.mp3”,所以我添加了一个按钮,弹出一个对话框供用户插入一个值。当按下 ok 时,字符串inputName的值应该被用户的输入替换,因此下次录制时,文件将与用户的输入一起保存为名称。问题:无论用户输入什么,文件总是以字符串的初始值保存,就好像用户从未输入过值一样。

public String inputName = "recorded_audio";

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.audio_recorder);

    recordBtn = findViewById(R.id.recordBtn);
    nameBtn = findViewById(R.id.nameBtn);

弹出对话框:

    nameBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            View view = (LayoutInflater.from(AudioRecorder.this)).inflate(R.layout.audio_name_input, null);

            AlertDialog.Builder alertBuilder = new AlertDialog.Builder(AudioRecorder.this);
            alertBuilder.setView(view);
            final EditText userInput = view.findViewById(R.id.userInput);

            alertBuilder.setCancelable(true).setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    inputName = String.valueOf(userInput.getText());
                }

            });

            Dialog dialog = alertBuilder.create();
            dialog.show();
        }
    });

保存文件:

    String folder_main = "Files/Recordings"; //Creates folder path
    File file = new File(Environment.getExternalStorageDirectory(), folder_main);
    file.mkdirs();
    mediaFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    mediaFileName += "/Files/Recordings/" + inputName + ".mp3";

录制按钮:

    recordBtn.setOnTouchListener(new View.OnTouchListener() {
                switch (motionEvent.getAction()) {

                    //User stops touching the button
                    case MotionEvent.ACTION_UP:
                        if (isRecording) {
                            stopRecording();

                            File file = new File(mediaFileName);
                            int file_size = Integer.parseInt(String.valueOf(file.length()));
                            if(file_size >= 4096) {
                                finish(); //Finishes activity.
                                startActivity(getIntent()); //Restarts activity in order to reset chronometer
                                startActivity(new Intent(AudioRecorder.this, AudioPlayer.class)); //Once recording is complete loads AudioPlayer activity
                            }
                            isRecording = false;
                        }
                        break;

                    //User touches the button
                    case MotionEvent.ACTION_DOWN:
                        //Recording Proccess
                        isRecording = true;
                        }
                        break;

                }
                return false;
            }

标签: javaandroid

解决方案


这应该不言而喻,但是您是否尝试过在这一行设置断点?:

inputName = String.valueOf(userInput.getText());

您需要验证此代码是否被调用。并且您应该在执行语句之前和之后观察 inputName 的值。正如@a_local_nobody 所说,您的语法不正确,无论如何都不会给您想要的东西,但是,它不应该让 inputName 保持不变(除非 String.valueOf 抛出您没有捕获的错误,这是可能的)。设置断点并逐步执行代码将向您准确显示正在发生的事情。这就是你的语法应该是这样的:

inputName = userInput.getText().toString();

您还需要检查 EditText userInput 实际上是实例化的,而不是空值。,


推荐阅读