EditText.getText()返回空字符串

时间:2017-11-05 21:33:29

标签: java android android-edittext

所以这是另一个已经提出了一百万次的问题,但我仍然做错了什么。使用EditText.getText()返回一个空字符串。

我是在我做过的小型自定义对话框中这样做的。我是否使用AlertDialog Builder构建它,这可能会导致问题?我现在真的不知道。

我曾尝试过的一些事情/关于我对此问题的了解:

  • 我在“确定”按钮的点击监听器中检查文本,因此我没有尝试在有一个值之前获取值,这是我看到的一个常见错误

  • 我在XML中为EditText对象设置了ID,调试器似乎表明我已正确引用它们。

  • 我尝试在onCreateDialog方法之外定义EditText对象并且没有改变(尽管我很好奇,这是更好的做法)。

  • 在getText()之前使用EditText.setText()将允许它返回setText()中使用的参数,但它似乎没有获取用户输入的值。

这是我的自定义Dialog Fragment:

public class GPSLocationDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        LayoutInflater inflater = getActivity().getLayoutInflater();
        final View view = inflater.inflate(R.layout.gps_dialog, null);

        final EditText latitudeText = (EditText) view.findViewById(R.id.latitude);
        final EditText longitudeText = (EditText) view.findViewById(R.id.longitude);

        // Define the dialog
        builder.setView(inflater.inflate(R.layout.gps_dialog, null))
                .setMessage("Manually input a GPS address")

                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        Log.d("myTag", "Text: " + latitudeText.getText()); // This prints ""

                        // These throw errors since they're trying to parse "" as a double
                        double latitude = Double.parseDouble(latitudeText.getText().toString());
                        double longitude = Double.parseDouble(longitudeText.getText().toString());
                    }
                })

                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        // Create the AlertDialog object and return it
        return builder.create();
    }
}

以下是我从我的活动中调用Dialog的方法:

GPSLocationDialogFragment gpsDialog = new GPSLocationDialogFragment();

gpsDialog.show(getFragmentManager(), "GPSDialog");

这是我的布局.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/longitude"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="4dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:hint="@string/longitude"
        android:inputType="numberSigned|numberDecimal" />
    <EditText
        android:id="@+id/latitude"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="4dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:hint="@string/latitude"
        android:inputType="numberSigned|numberDecimal" />
</LinearLayout>

如果需要更多上下文,我可以分享它,我试图简化为相关代码。

1 个答案:

答案 0 :(得分:1)

尝试更改此内容:

builder.setView(inflater.inflate(R.layout.gps_dialog, null))

到此:

builder.setView(view)

发生的事情是您将gps_dialog xml膨胀并将其布局层次结构转换为视图。然后你找到EditText&a;并指定对它们的引用。

然而,通过致电setView(inflater.inflate(R.layout.gps_dialog, null))  而不是传递您已经膨胀的视图,并且您的子EditText是您对对话框的引用,您正在做的是膨胀gps_dialog.xml的 new 版本和将那个传递给对话框。您拥有的参考文献是不在屏幕上的EditText。