代码之家  ›  专栏  ›  技术社区  ›  Ofek Pintok

在Dialogfragment中显示DatePickerDialog

  •  0
  • Ofek Pintok  · 技术社区  · 7 年前

    DialogFragment 有一个 EditText 编辑文本 DatePickerDialog 假设从用户那里选择一个日期,然后在 对话片段

    1. DatePickerDialog实际上出现了,但却破坏了旧的 对话片段
    2. 我想把我选的日期传给碎片。如果我想把它传给某个活动,因为我可以使用 getActivity() 方法。那么,我怎样才能把我挑选的日期传递回称为挑选者的片段呢?

    主碎片

    public class NewWorkoutItemFragment extends android.app.DialogFragment implements
        View.OnClickListener {
    
    private String mDate;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_new_workout_item, container, false);
    
        //A lot of code
    
        return view;
    }
    
    @Override
    public void onClick(View v) {
    switch (v.getId()){
        case R.id.NewWorkout_date_et:
            //Call to DatePickerDialog
            DialogFragment pickDate = new DatePickerFragment();
            pickDate.show(getFragmentManager(), "show");
    }
    
    public void setmDate(String mDate) {
        this.mDate = mDate;
    }
    }
    

    日期选择器碎片

    public class DatePickerFragment extends android.app.DialogFragment implements DatePickerDialog.OnDateSetListener {
    
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in 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);
    
        // Create a new instance of DatePickerDialog and return it.
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }
    
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    String dateString = Integer.toString(dayOfMonth) +
                    "/" + Integer.toString(month+1) +
                    "/" + Integer.toString(year);
        //note- Return dateString back to NewWorkoutItemFragment, using setmDate
    }
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Feedforward    7 年前

    你应该使用 'com.wdullaer:materialdatetimepicker:2.3.0' 图书馆 datepicker timepicker 对话框。
    app level gradle file . 之后创建一个新的java文件 NewWorkoutItemFragment extends DialogFragment

    public class NewWorkoutItemFragment extends DialogFragment implements 
    DatePickerDialog.OnDateSetListener {
    
    @OnClick(R.id.layout_time)
    public void onClickTime(View view){
        calendar= Calendar.getInstance();
    
    
            datePickerDialog= TimePickerDialog.newInstance(NewWorkoutItemFragment.this,
                    calendar.get(Calendar.YEAR), // Initial year selection
                    calendar.get(Calendar.MONTH), // Initial month selection
                    calendar.get(Calendar.DAY_OF_MONTH) // Inital day selection
                    false);
    
        datePickerDialog.setThemeDark(false);
        datePickerDialog.setAccentColor(Color.parseColor("#58a5f0"));
        datePickerDialog.setTitle("Select Date");
        datePickerDialog.show(getFragmentManager(),"DatePicker Dialog");
    
    }
    
    public NewWorkoutItemFragment() {
    }
    
    public static NewWorkoutItemFragment newInstance (String title) {
        NewWorkoutItemFragment frag = new NewWorkoutItemFragment();
        Bundle args = new Bundle();
        args.putString("title", title);
        frag.setArguments(args);
        return frag;
    }
    
    @Override
    public void onAttach(final Context context) {
        super.onAttach(context);
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
    }
    
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Dialog dialog = super.onCreateDialog(savedInstanceState);
    
        final Window window = dialog.getWindow();
        if (window != null) {
            window.requestFeature(Window.FEATURE_NO_TITLE);
            window.setBackgroundDrawableResource(android.R.color.transparent);
    
            WindowManager.LayoutParams windowLayoutParams = window.getAttributes();
            windowLayoutParams.dimAmount = DIM_AMOUNT;
        }
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        return dialog;
    }
    
    
    @Nullable
    @Override
    public View onCreateView(final LayoutInflater inflater,
                             final ViewGroup container,
                             final Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.dlg_network, container, false);
        return view;
    }
    
    @Override
    public void onResume() {
        super.onResume();
        final int width = getScreenWidth();
        changeWindowSizes(width, ViewGroup.LayoutParams.WRAP_CONTENT);
    }
    
    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }
    
    private void changeWindowSizes(int width, int height) {
        final Window window = getDialog().getWindow();
        if (window != null) {
            // hack to change window width
            window.setLayout(width, height);
        }
    }
    
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mUnbinder.unbind();
    }
    
    @Override
    public int getTheme() {
        return R.style.CustomDialog;
    }
    
    @Override
    public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
     String date = "You picked the following date: "+dayOfMonth+"/"+(monthOfYear+1)+"/"+year;
     dateTextView.setText(date);
    }
    
    
    }
    

    NewWorkoutItemFragment 只需将这个dialog类的对象

    newWorkDialog= new NewWorkoutItemFragment();
    NewWorkoutItemFragment newWorkDialog;
    newWorkDialog= NewWorkoutItemFragment.newInstance("T");
    newWorkDialog.show(manager,"Show");
    

    在样式文件中,只需添加以下行

    <style name="CustomDialog" parent="Theme.AppCompat.Light.Dialog">
        <item name="android:windowAnimationStyle">@style/CustomDialogAnimation</item>
    </style>
    
    <style name="CustomDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/translate_left_side</item>
        <item name="android:windowExitAnimation">@anim/translate_right_side</item>
    </style>
    

    res 说出它的名字 anim 并在中创建两个文件 动画 transition_left_side transition_right_side

    代码 转换\u左侧\u

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fromXDelta="100%"
    android:toXDelta="0%"/>
    

    和代码

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0%" android:toXDelta="100%"
    android:fromYDelta="0%" android:toYDelta="0%"
    android:duration="600"/>
    

    我想这不会造成任何进一步的错误。

        2
  •  0
  •   Ofek Pintok    7 年前

    解决办法不是 datepickerdialog 完全。我的片段中有一个开关盒,用于管理点击事件。我不小心忘了放一个 break; 在导致其他事件(其中一个是 dismiss(); ),这就是为什么datepickerdialog也拒绝了我的片段。