java - 无法更改预定义的字符串值
问题描述
我正在构建一个录音机应用程序。要存储创建的音频文件,我使用此字符串创建它们来命名它们
`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;
}
解决方案
这应该不言而喻,但是您是否尝试过在这一行设置断点?:
inputName = String.valueOf(userInput.getText());
您需要验证此代码是否被调用。并且您应该在执行语句之前和之后观察 inputName 的值。正如@a_local_nobody 所说,您的语法不正确,无论如何都不会给您想要的东西,但是,它不应该让 inputName 保持不变(除非 String.valueOf 抛出您没有捕获的错误,这是可能的)。设置断点并逐步执行代码将向您准确显示正在发生的事情。这就是你的语法应该是这样的:
inputName = userInput.getText().toString();
您还需要检查 EditText userInput 实际上是实例化的,而不是空值。,
推荐阅读
- javascript - 如何通过角度以表格格式打印数组对象?
- javascript - 如何危险地设置 idSetInnerHTML?
- r - 读取,子集“选择”并在R中写入txt文件
- java - 正则表达式匹配来自多个相似标签的标签数据
- python-3.x - 从 splittext() 结果中剥离 '
- php - Laravel 5.6 - 路由 api 资源 404 错误
- nginx - Nginx try_files 配置与旧 URL 的重定向检查?
- regex - 正则表达式查找模式并替换为更改的结果
- c# - “您是否缺少 using 指令或程序集引用?” C# ASP.NET 错误
- nginx - 带有php的Nginx自定义404页面不起作用