【问题标题】:EditText dialog input always null (Android)EditText 对话框输入始终为空(Android)
【发布时间】:2017-01-02 22:45:32
【问题描述】:

以下代码在按钮的 onClick 方法中运行,并弹出一个对话框。我可以输入文本并按确定,但我的字符串文件名(如 Log.d 中所示)始终为空。我不明白为什么。

如何获取对话框中输入的文字进行保存?

我的代码在活动中运行(无片段),字符串文件名和 EditText 输入都是类成员变量。

  // Get filename from user
    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setTitle("Enter filename");

    // EditText to get user input
    this.input = new EditText(this);
    dialog.setView(input);

    dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            filename = input.getText().toString();
        }
    });

    dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // cancelled
        }
    });
    dialog.show();
    Log.d(LOG_TAG, "Filename is : " + filename);

我的代码基于android prompt user's input using a dialog,但我的问题不同。

【问题讨论】:

    标签: android android-edittext android-dialog


    【解决方案1】:

    您尝试在实际输入数据之前记录字符串。 尝试将日志放在积极的 onClick 中,我想你会看到它确实保存了。

    像这样:

    // Get filename from user
    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
    dialog.setTitle("Enter filename");
    
    // EditText to get user input
    this.input = new EditText(this);
    dialog.setView(input);
    
    dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            filename = input.getText().toString();
            Log.d(LOG_TAG, "Filename is : " + filename);
        }
    });
    
    dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // cancelled
        }
    });
    dialog.show();
    

    【讨论】:

    • 这有效(显示我输入的内容)但为什么它不保存到成员变量?我无法在 onClick 中调用文件名上的此关键字,但我没有另一个具有该名称的变量。
    • 它确实保存了,但你不能在你调用 dialog.show(); 的同一个函数中使用它。因为它将在用户单击对话框中的 OK 之前执行。使用文件名需要做的是将所有代码放在 onClick 函数中,或者从 onClick 调用另一个函数。 (或者如果我没有正确理解,请详细说明)。
    • 这行得通。我将其余代码放在私有方法中并传入文件名。我可以看到它阻塞了一些东西,因为我在第二次调用对话框后设法让第二条日志语句(使用成员变量)运行。我不完全理解为什么我需要移动它的逻辑。我想一种新方法可以使代码在父类或活动中运行,而不是在 DialogInterface.OnClickListener() 接口中运行,但我仍然认为我的第一种方法是有道理的。
    • 在您的原始方法中,将输入保存到 Filename 变量中的代码位于名为 OnClickListener 的内部类中。它只会在用户单击 OK 按钮后执行。 Log.d(...) 命令是在 dialog.show() 命令之后编写的,因此它会在显示对话框后的几分之一秒后立即执行(在用户有机会输入任何内容并单击之前)好的。(我希望我说得通)
    • 我明白了。程序继续运行,但 onClick 回调尚未发生。我似乎忘记了回调是如何工作的,哈哈。谢谢。
    猜你喜欢
    • 2021-05-25
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多