Ошибка при получении тега из DatePickerFragment - PullRequest
0 голосов
/ 09 апреля 2019

Я создаю приложение с двумя DatePicker для установки даты начала и окончания.Поскольку DatePicker вызывается из DialogFragments, я установил два тега, чтобы дифференцировать результаты в основном действии:


 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sel_start_date:
                DialogFragment startDatePicker = new DatePickerFragment();
                startDatePicker.show(getSupportFragmentManager(), START_DATE_PICKER_TAG);
                break;
           case R.id.sel_end_date:
                DialogFragment endDatePicker = new DatePickerFragment();
                endDatePicker.show(getSupportFragmentManager(), END_DATE_PICKER_TAG);
                break;

Класс DatePickerFragment:

public class DatePickerFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(getActivity(), (DatePickerDialog.OnDateSetListener) getActivity(), year, month, day );
    }

, и вот как я получаюрезультат в основном действии

  @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        if (view.getTag().equals(START_DATE_PICKER_TAG)) {
            calendarStartDate.set(Calendar.YEAR, year);
            calendarStartDate.set(Calendar.MONTH, month);
            calendarStartDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            start_date_btn.setText(dayOfMonth + "/" + (month + 1) + "/" + year);
        } else {
            calendarEndDate.set(Calendar.YEAR, year);
            calendarEndDate.set(Calendar.MONTH, month);
            calendarEndDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            end_date_btn.setText(dayOfMonth + "/" + (month + 1) + "/" + year);
        }
    }

Однако я получаю исключение nullPointerException, выполняя view.getTag ().Как я могу решить это, или как еще я могу дифференцировать результаты?

Aclaration: DatePickerDialog - это нативный класс, а не тот, который я создал, поэтому я не могу редактировать их методы`

TimePickerFragment:

public class TimePickerFragment extends DialogFragment {
    private static final String ARGS_TAG = "ARGS_TAG";

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Calendar calendar = Calendar.getInstance();
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);

        final String tag = getArguments().getString(ARGS_TAG);
        return new TimePickerDialog(getActivity(), (TimePickerDialog.OnTimeSetListener) getActivity(), hour, minute, android.text.format.DateFormat.is24HourFormat(getActivity())) {
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                }
            };
    }

    public static TimePickerFragment newInstance(String tag){
        Bundle args = new Bundle();
        args.putString(ARGS_TAG, tag);
        TimePickerFragment fragment = new TimePickerFragment();
        fragment.setArguments(args);
        return fragment;
    }

Ответы [ 3 ]

0 голосов
/ 09 апреля 2019

Как вы можете видеть, ваше представление в onDateSet является DatePicker, и вы устанавливаете свой тег на фрагменте, содержащем DatePicker, который является DatePickerDialog.

Таким образом, чтобы получить свой тег, вы должны попробовать что-то вроде:

@Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        if (view.getParent() != null && view.getParent().getTag().equals(START_DATE_PICKER_TAG)) {
            calendarStartDate.set(Calendar.YEAR, year);
            calendarStartDate.set(Calendar.MONTH, month);
            calendarStartDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            start_date_btn.setText(dayOfMonth + "/" + (month + 1) + "/" + year);
        } else {
            calendarEndDate.set(Calendar.YEAR, year);
            calendarEndDate.set(Calendar.MONTH, month);
            calendarEndDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            end_date_btn.setText(dayOfMonth + "/" + (month + 1) + "/" + year);
        }
    }
0 голосов
/ 09 апреля 2019

Решение: Определить два интерфейса для пересылки данных из фрагментов в действие.

Шаг 1 .Определите OnDateSetListener интерфейс для связи между MainActivity и DatePickerFragment.

public interface OnDateSetListener {
    void onDateSet(String tag, DatePicker view, int year, int month, int dayOfMonth);
}

Шаг 2 .Определите OnTimeSetListener интерфейс для связи между MainActivity и TimePickerFragment.

public interface OnTimeSetListener {
    void onTimeSet(String tag, TimePicker view, int hourOfDay, int minute);
}

Шаг 3 .Пусть MainActivity реализует оба интерфейса.

public class MainActivity extends AppCompatActivity implements OnDateSetListener, OnTimeSetListener {

    // Your code her
    ...

    @Override
    public void onDateSet(String tag, DatePicker view, int year, int month, int dayOfMonth) {
        // Process code with tag here
    }

    @Override
    public void onTimeSet(String tag, TimePicker view, int hourOfDay, int minute) {
        // Process code with tag here.
    }
}

Шаг 4 .Измените код в DatePickerFragment

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    private static final String ARGUMENT_TAG = "ARGUMENT_TAG";

    public static DatePickerFragment newInstance(String tag) {
        Bundle args = new Bundle();
        args.putString(ARGUMENT_TAG, tag);
        DatePickerFragment fragment = new DatePickerFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(requireActivity(), this, year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        final String tag = getArguments().getString(ARGUMENT_TAG);
        OnDateSetListener listener = (OnDateSetListener) requireActivity();
        listener.onDateSet(tag, view, year, month, dayOfMonth);
    }
}

Шаг 5 .Изменить код в TimePickerFragment.

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
    private static final String ARGS_TAG = "ARGS_TAG";

    public static TimePickerFragment newInstance(String tag) {
        Bundle args = new Bundle();
        args.putString(ARGS_TAG, tag);
        TimePickerFragment fragment = new TimePickerFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Calendar calendar = Calendar.getInstance();
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        return new TimePickerDialog(requireActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity()));
    }


    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        final String tag = getArguments().getString(ARGS_TAG);
        OnTimeSetListener listener = (OnTimeSetListener) requireActivity();
        listener.onTimeSet(tag, view, hourOfDay, minute);
    }
}
0 голосов
/ 09 апреля 2019

Как я вижу, вы установили тег на Фрагмент , но вы пытаетесь получить тег View . Это не одно и то же, поскольку тег представления - это объект, а тег фрагмента - строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...