EditText.getText()返回空字符串



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

我在一个小的自定义对话框中进行此操作。我正在使用AlertDialog Builder构建它,这可能会导致问题?我现在真的不知道。

我尝试过的一些事情/注意到我对这个问题的了解:

  • 我正在检查"确定"按钮的点击侦听器中的文本,所以我不会在出现值之前尝试获取值,这是我看到的一个常见错误。

  • 我为XML中的EditText对象设置了ID,调试器似乎显示我正确地引用了它们。

  • 我已经尝试在onCreateDialog方法之外定义EditText对象,但这并没有改变事情(尽管我很好奇哪种做法更好)。

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

这是我的自定义对话框片段:

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();
}
}

以下是我在活动中调用对话框的方式:

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>

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

尝试更改此项:

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

到此:

builder.setView(view)

现在的情况是,您对gps_dialog xml进行了扩展,并将其布局层次结构转换为View。然后您会找到EditText,并为它们指定一个引用。

但是,通过调用setView(inflater.inflate(R.layout.gps_dialog, null))您所做的不是将您已经膨胀的视图以及您引用其子EditText的视图传递到对话框,而是膨胀gps_dialog.xml的版本,并将该传递到对话框。您所拥有的引用是对屏幕上没有的EditText的引用。

最新更新