从DatePickerFragment

时间:2019-04-09 08:50:32

标签: java android android-fragments datepicker tags

我正在创建一个带有两个DatePicker的应用程序,以设置开始日期和结束日期。从DialogFragments调用DatePicker时,我设置了两个标签来区分主活动中的结果:


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

但是,我在执行view.getTag()时得到了一个nullPointerException。如何解决这个问题,或者如何区分结果?

声明: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 :(得分:0)

如我所见,您已将标签设置为片段,但是您尝试获取的是视图的标签。它们不是一回事,因为视图的标签是一个对象,而片段的标签是一个字符串。

答案 1 :(得分:0)

您可以看到onDateSet中的视图是一个DatePicker,然后将标签设置在包含DatePicker的片段上,即DatePickerDialog。

因此,要获取标签,您应该尝试类似的操作:

      <?xml version="1.0" encoding="utf-8"?>
      <menu 
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      xmlns:app="http://schemas.android.com/apk/res-auto">
      <group

      android:id="@+id/group_member"
      android:checkableBehavior="single">
      <item
        android:id="@+id/navigation_sign_in"
        android:icon="@drawable/ic_account"
        app:theme="@style/NavDrawerTextStyle"
        android:title="@string/menu_user_settings" />
      </group>
      <group
      android:id="@+id/group_information"
      android:checkableBehavior="single">
      <item
        android:id="@+id/navigation_registered_users_list"
        android:icon="@drawable/ic_people_black_24dp"
        android:title="@string/menu_registered_user_list" />
      <item
        android:icon="@drawable/ic_star_black_24dp"
        android:title="@string/menu_rate_us" />
    <item
        android:icon="@drawable/ic_info_outline_black_24dp"
        android:title="@string/menu_about_us" />
    <item
        android:icon="@drawable/ic_phone_in_talk_black_24dp"
        android:title="@string/menu_contact" />
</group>

答案 2 :(得分:0)

解决方案::定义两个接口以将数据从片段转发到活动。

步骤1 。定义OnDateSetListener接口以在MainActivityDatePickerFragment之间进行通信。

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

第2步。定义OnTimeSetListener接口以在MainActivityTimePickerFragment之间进行通信。

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