Обновление поля действий изнутри состояния c DateDialogFragment в Android - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь реализовать поле EditText, в котором при нажатии будет отображаться средство выбора даты. Из того, что я прочитал, DateDialogFragment было рекомендовано в качестве современного решения.

Для простоты я удалил из программы нерелевантный код:

public class EditStepCountEntryActivity extends AppCompatActivity
{
    private EditText mChangeDateField;
    private static DateTimeFormatter dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_step_count_entry);

        initViews();
    }

    private void initViews()
    {
        mChangeDateField = findViewById(R.id.changeDateField);
        mChangeDateField.setInputType(InputType.TYPE_NULL);
        mChangeDateField.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                onChangeDateButtonClicked();
            }
        });
    }

    public void onChangeDateButtonClicked()
    {
        DateDialogFragment datePicker = new DateDialogFragment();
        datePicker.show(getSupportFragmentManager(), "showDate");
    }

    public class DateDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
    {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState)
        {
            LocalDate date = LocalDate.parse(mStepCountDate.getText(), dateFormat);
            int year = date.getYear();
            int month = date.getMonthValue();
            int day = date.getDayOfMonth();

            return new DatePickerDialog(getActivity(), this, year, month, day);
        }

        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
        {
            showSetDate(LocalDate.of(year, monthOfYear, dayOfMonth));
        }
    }

    public void showSetDate(LocalDate date)
    {
        String dateText = date.format(dateFormat);
        mStepCountDate.setText(dateText);
    }
}

Когда я нажимаю EditText, я получаю следующую ошибку:

java .lang.IllegalStateException: Fragment com.example. android .keepfitapp.EditStepCountEntryActivity.DateDialogFragment должен быть классом publi c stati c, который должен быть правильно воссоздан из состояния экземпляра. в androidx.fragment.app.FragmentTransaction.doAddOp (FragmentTransaction. java: 249) в androidx.fragment.app.BackStackRecord.doAddOp (BackStackRecord. java: 180) в androidx.fragment.app.FragmentTransactionTransaction.add ( . java: 171) в androidx.fragment.app.DialogFragment.show (DialogFragment. java: 174) в com.example. android .keepfitapp.EditStepCountEntryActivity.onChangeDateButtonClicked (EditStepCount7) *33 * Edit *tepCount7ntryA 1012 *

В сообщении об ошибке указывается, что Fragment должен быть stati c, однако, если Fragment is stati c, у меня больше не будет доступа к Activity EditText.

Я мог бы передать дату в Fragment в связке, но как я могу получить новую дату, введенную обратно в Activity?

1 Ответ

1 голос
/ 10 февраля 2020

Привет, у меня была такая же проблема. Вот как я это решаю:

Шаг 1 заставьте вашу деятельность реализовать DatePickerDialog.OnDateSetListener (и удалить его из DialogFragment).

Шаг 2, Замените код с onCreateDialog на:

    final Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);

    // Activity needs to implement this interface
    DatePickerDialog.OnDateSetListener listener = (DatePickerDialog.OnDateSetListener) getActivity();
    DatePickerDialog q = new DatePickerDialog(getActivity(), listener, year, month, day);
    return q;

Шаг 3 , Переопределите метод onDateSet в своей активности (и удалите его из DialogFragment) и обновите текстовое поле, когда дата будет установлена.

Надеюсь, что он ответит на ваш вопрос:)


A Полный рабочий пример: (Чтобы его было легко понять :)):

public class MainActivity extends AppCompatActivity  implements DatePickerDialog.OnDateSetListener {
TextView mChangeDateField;
@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mChangeDateField = findViewById(R.id.changeDateField);

}

public void setDateText(View view){
    ClientChooseDateFragment newFragment =
            new ClientChooseDateFragment();
    newFragment.show(getSupportFragmentManager(),
            "datePicker");

}

@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    mChangeDateField.setText("-- " + year + "--- Month" +month);
}


public static class  ClientChooseDateFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current time as the default values for the picker
        final Calendar c = Calendar.getInstance();

        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Activity needs to implement this interface
        DatePickerDialog.OnDateSetListener listener = (DatePickerDialog.OnDateSetListener) getActivity();
        DatePickerDialog q = new DatePickerDialog(getActivity(), listener, year, month, day);

        return q;
    }
}}
...