java - 暂停代码,直到用户在对话框提示上输入数据
问题描述
我有一个应用程序,可以让用户输入文本并将其导出到 txt 文件。当用户按下保存按钮时,会出现一个对话框,询问用户他们想如何命名文件。用户键入一个作为字符串值的名称,然后将其与“.txt”连接起来作为最终文件名。问题是程序会立即保存文件,而无需等待用户输入名称,因此它会使用字符串的先前值,即使它为空。为空时,文件名为“null.txt”。下次用户尝试保存文件时,应用程序将立即保存文件并使用先前在第一次尝试中输入的值并继续进行。
保存按钮:
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openDialog(); //Calls for the dialog pop-up
exportText = resultText.getText().toString().trim(); //.trim() removes space before and after text
if (!exportText.isEmpty()) {
saveToTxtFile(exportText);
} else {
Toast.makeText(SpeechToText.this, "Input field empty...", Toast.LENGTH_SHORT).show();
}
}
});
保存方法:
private void saveToTxtFile(String mText) {
try {
File path = Environment.getExternalStorageDirectory(); //path to storage
File dir = new File(path + "/My App/Text Files/"); //create folders
dir.mkdirs();
String fileName = inputName + ".txt";
File file = new File(dir, fileName);
//FileWriter class is used to store characters in file
FileWriter fw = new FileWriter(file.getAbsolutePath());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(mText);
bw.close();
Toast.makeText(SpeechToText.this, "Saved successfully...", Toast.LENGTH_SHORT).show();
} catch(Exception e) {
//if anything goes wrong
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
对话框弹出方法:
public void openDialog() {
View view = (LayoutInflater.from(SpeechToText.this)).inflate(R.layout.user_input, null);
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(SpeechToText.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();
}
解决方案
这是未经测试的,但你可以尝试这样的事情......
你应该只openDialog
在saveBtn
被点击时调用
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openDialog(); //Calls for the dialog pop-up
}
});
然后在对话框中添加一个保存按钮并在该点保存数据。添加onShowListener
将阻止对话框关闭,直到您需要它为止。
public void openDialog() {
View view = (LayoutInflater.from(SpeechToText.this)).inflate(R.layout.user_input, null);
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(SpeechToText.this);
alertBuilder.setView(view);
final EditText userInput = view.findViewById(R.id.userInput);
alertBuilder.setCancelable(true).setPositiveButton("Ok", null).setNegativeButton("Cancel", null);
Dialog dialog = alertBuilder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
Button deleteAllButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
deleteAllButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
inputName = String.valueOf(userInput.getText());
exportText = resultText.getText().toString().trim(); //.trim() removes space before and after text
if (!exportText.isEmpty()) {
saveToTxtFile(exportText);
dialog.dismiss();
} else {
Toast.makeText(SpeechToText.this, "Input field empty...", Toast.LENGTH_SHORT).show();
}
}
});
Button cancelButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_NEUTRAL);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
}
});
dialog.show();
}
推荐阅读
- javascript - 解析来自 MondoDB Atlas 的数据
- flutter - 动态地将维度添加到布尔数组
- azure - 带有加密的 Cosmos DB 的 ARM 模板中的循环依赖问题
- excel - ActiveX 组合框 VBA 内的参考值
- c++ - 当数组是 STL 容器类型时,将每个索引分配给 nullptr 的适当语法是什么
- html - 使用引导程序在 html 中将容器居中
- r - 在 r 中更改 forestplotRegrObj 的名称
- import - 运行 jupyter notebook 时从存储库的根目录导入
- python - 如何阻止 Pydantic 接受嵌套模型中的附加属性
- database - 计算文件被查看的次数