Почему EditText отображает пользовательский ввод, но не удерживает его? - PullRequest
0 голосов
/ 18 июня 2019

Я столкнулся с очень странным поведением, которое заставляет меня вырывать волосы.Объекты EditText содержат пустые строки независимо от того, что в них введено, и я не могу понять, почему.Я пытался найти похожие записи, но

EditText продолжает возвращать ноль? Я не получаю сообщение об ошибке, только сбой объектов EditText.

EditText редактируемый, но getText () возвращает пустую строку Я попытался объявить объекты EditText, как показано на этой странице, но это не имело значения.Кроме того, другие мои фрагменты, используемые в той же ситуации, не имеют таких проблем.

Мои результаты поиска не дали ничего похожего на то, что я испытываю.

Вот мой файл макета:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">


<TextView
android:id="@+id/tvTitleDateField"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_width="wrap_content"
android:text="@string/date"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="@+id/appointmentDate"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/appointmentDate"/>

<EditText
android:id="@+id/appointmentDate"
android:layout_width="325dp"
android:layout_height="47dp"
android:layout_marginStart="24dp"
android:layout_marginTop="8dp"
android:ems="10"
android:autofillHints="@string/hint_tap_to_set_date"
android:hint="@string/hint_tap_to_set_date"
android:inputType="text"
app:layout_constraintStart_toEndOf="@+id/tvTitleDateField"
app:layout_constraintTop_toTopOf="parent"/>

<TextView
android:id="@+id/tvTitleTimeField"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/time"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="@+id/appointmentTime"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/appointmentTime"/>

<EditText
android:id="@+id/appointmentTime"
android:layout_width="311dp"
android:layout_height="42dp"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
android:autofillHints="@string/hint_tap_to_set_time"
android:ems="10"
android:hint="@string/hint_tap_to_set_time"
android:inputType="text"
app:layout_constraintStart_toEndOf="@+id/tvTitleTimeField"
app:layout_constraintTop_toBottomOf="@+id/appointmentDate"/>

<TextView
android:id="@+id/tvTitleNotificationField"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/notification"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="@+id/appointmentNotification"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/appointmentNotification"/>

<EditText
android:id="@+id/appointmentNotification"
android:layout_width="256dp"
android:layout_height="42dp"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"
android:autofillHints="@string/hint_tap_to_enter_notification"
android:ems="10"
android:hint="@string/hint_tap_to_enter_notification"
android:inputType="number"
app:layout_constraintStart_toEndOf="@+id/tvTitleNotificationField"
app:layout_constraintTop_toBottomOf="@+id/appointmentTime"/>

<TextView
android:id="@+id/tvNotes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textSize="24sp"
android:text="@string/notes"
app:layout_constraintBottom_toBottomOf="@+id/appointmentNotes"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/appointmentNotes"/>

<EditText
android:id="@+id/appointmentNotes"
android:layout_width="301dp"
android:layout_height="44dp"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
android:autofillHints="@string/notes"
android:ems="10"
android:gravity="start|top"
android:hint="@string/notes"
android:inputType="textMultiLine"
app:layout_constraintStart_toEndOf="@+id/tvNotes"
app:layout_constraintTop_toBottomOf="@+id/appointmentEvent"/>

<TextView
android:id="@+id/tvEvent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/event"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="@+id/appointmentEvent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/appointmentEvent"/>

<EditText
android:id="@+id/appointmentEvent"
android:layout_width="311dp"
android:layout_height="41dp"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
android:autofillHints="@string/enter_event"
android:ems="10"
android:hint="@string/enter_event"
android:inputType="textMultiLine"
app:layout_constraintStart_toEndOf="@+id/tvEvent"
app:layout_constraintTop_toBottomOf="@+id/appointmentNotification"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Вот соответствующие части кода фрагмента:

public class ScheduleAppointmentFragment extends Fragment implements FragmentNameProvider{
private static EditText date;
private static EditText time;
private static EditText notification;
private static EditText event;
private static EditText notes;
.
.
.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "Entered: onCreate");
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
sMedicalInformationViewModel = ViewModelProviders.of(this).get(MedicalInformationViewModel.class);
if(getArguments() != null){
petId = getArguments().getInt(PET_ID_KEY);
name = getArguments().getString(PET_NAME_KEY);
appointmentId = getArguments().getString(APPOINTMENT_ID_KEY);
appointmentDate = getArguments().getString(APPOINTMENT_DATE_KEY);
appointmentTime = getArguments().getString(APPOINTMENT_TIME_KEY);
appointmentNotification = getArguments().getString(APPOINTMENT_NOTIFICATION_KEY);
appointmentEvent = getArguments().getString(APPOINTMENT_EVENT_KEY);
appointmentNotes = getArguments().getString(APPOINTMENT_NOTES_KEY);
Log.d(TAG, "appointmentEvent is: " + appointmentEvent);
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
Log.d(TAG, "Entered: onCreateView");
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_schedule_appointment, container, false);
Log.d(TAG, "container is: " + container);
date = view.findViewById(R.id.appointmentDate);
Log.d(TAG, "date at creation is: " + date);
date.setText("This is a test");
date.setVisibility(View.VISIBLE);
Log.d(TAG, "date is initially: " + date.getText());
date.setClickable(true);
date.setOnClickListener(new View.OnClickListener(){

public void onClick(View view) {
Log.d(TAG, "Date EditText field clicked");
CalendarDialogFragment calendarFragment = new CalendarDialogFragment();
//FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
calendarFragment.show(getFragmentManager(), "setFragment");
}
});
.
. (the other EditText entities go here)
.
}

public void saveUserInput(){
Log.d(TAG, "Entered: saveUserInput");
Log.d(TAG, "date is: " + date);
Log.d(TAG, "date now is set to: " + date.getText());
String dateInput = date.getText().toString();
Log.d(TAG, "date at saveUserInput is: " + date);
Log.d(TAG, "dateInput is: " + dateInput);
String timeInput = time.getText().toString();
String notificationInput = notification.getText().toString();
String eventInput = event.getText().toString();
String notesInput = notes.getText().toString();

ContentValues values =  new ContentValues();
values.put(APPOINTMENT_DATE, dateInput);
values.put(APPOINTMENT_TIME, timeInput);
values.put(APPOINTMENT_NOTIFICATION, notificationInput);
values.put(APPOINTMENT_EVENT, eventInput);
values.put(APPOINTMENT_NOTES, notesInput);
Log.d(TAG, "appointment values are: " + values);
}
}

Фрагмент загружается в штрафе Activity, все объекты TextViews и EditText являются видимыми, можно щелкнуть и текст иличисла могут быть введены. Хотя поле EditText можно щелкнуть и, кажется, принимает символы, метод onClick никогда не вводится.date.setText("This is a test"); не имеет видимого эффекта, текст подсказки остается на экране.Однако date.setText("This is a test"); устанавливает текст для переменной даты, когда LogCat отображает: D/ScheduleAppointmentFragment: date is initially: This is a test из onCreateView. Объект даты создан и на него ссылаются в onCreateView, как видно из записи LogCat. Дата создания: androidx.appcompat.widget.AppCompatEditText {6f017c VFED..CL....... I.0,0-0,0 # 7f080036 приложение: идентификатор / назначенна дата} . Ссылка на объект даты остается такой же, как в записи LogCat метода saveUserInput (). Дата в saveUserInput: androidx.appcompat.widget.AppCompatEditText {6f017cVFED..CL....... I.0,0-0,0 # 7f080036 app: id / meetingDate} . Я ввожу значения в каждый объект EditText, которые отображаются как введенные, но все переменные загружаются через xxx.getText().toString() как "" (пустая строка), как показано в LogCat: Значения встреч:= meetingDate = Это тестовое назначение встречи = (дата была загружена в onCreateView). Я попробовал макет как linearlayout и получил тот же результат. Я добавил date.setVisibility (View.VISIBLE);как эксперимент безуспешно.Он не нужен и не используется в других фрагментах, которые принимают пользовательский ввод. Я установил android:inputType="text" для теста. Другие фрагменты загружаются в Activity точно так же и служат шаблоном для этого ошибочного фрагмента. Этот фрагмент создается с пустым конструктором, метод newInstance не вызывается.

Есть предложения относительно того, почему этот фрагмент не отображает заданное значение и не содержит введенные значения?

...