Retrieve and set data from DialogFragment (DatePicker)

久未见 提交于 2019-12-18 05:11:11

问题


My DialogFragment class is invoked when I press a button on a activity. I want the date set through this DialogFragment to be displayed on the buttons text. FindViewById refuses to be recognized by the class.

I found a similar question but I'm unable to relate it to my case.

Code:

  1. Button which calls the Dialogue fragment:

    public void datepicker(View v) {
        DialogFragment newFragment = new DatePickerFragment();
        newFragment.show(getFragmentManager(), "datePicker"); 
    }
    
  2. Code for dialogue fragment:

    public class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceSateate) {
    
            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);
    
                return new DatePickerDialog(getActivity(), this, year, month, day);
            }
    
            public void onDateSet(DatePicker view, int year, int month, int day) {
                // Do something with the date chosen
            }
        }
    }
    

回答1:


In the method in your DialogFragment that is in charge of being notified when the user sets the date, do this

Button activityButton = (Button)getActivity().findViewById(R.id.myButton);
activityButton.setText (myDate);



回答2:


Create Class for DatePicker Fragment:

    public class SelectDateFragment extends DialogFragment implements
                                     DatePickerDialog.OnDateSetListener {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

            Calendar now = Calendar.getInstance();
            year = now.get(Calendar.YEAR);
            month = now.get(Calendar.MONTH);
            day = now.get(Calendar.DATE);

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

    public void onDateSet(DatePicker view, int year, int month, int day) {
        orderDateEditText.setText(year + "-" + (month + 1) + "-" + day);
    }
}

Call this Fragment When clicked On ImageButton:

    /** Create DatePicker dialog on click of OrderDateEditText **/
   orderDatePickerButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            DialogFragment newFragment = new SelectDateFragment();
            newFragment.show(getFragmentManager(), "DatePicker");
        }
    });

In Month there is plus 1 because DatePicker default takes month from 0 to 11 for Jan to Dec.

Thank you..




回答3:


here's a good pattern to follow:

  1. create a listener interface in your dialog to handle the relevant button presses in the dialog
  2. implement it in the starting activity
  3. when the user presses "okay" or "cancel", call the listener methods
  4. do whatever you need to do in the impl of the listener to update the activity's view

something like,

class MyDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {
  static interface Listener {
    void onOkay(MyObject result);
    void onCancel();
  }
  ...

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    ...

    // set this as a listener for ok / cancel buttons
    return new AlertDialog.Builder(activity)...whatever...
        .setPositiveButton(R.string.ok, this)
        .setNegativeButton(R.string.cancel, this).create();
  }

  @Override
  public void onClick(DialogInterface dialog, int which) {
      if (which == DialogInterface.BUTTON_POSITIVE) {
          if (getActivity() instanceof Listener) {
              ((Listener)getActivity()).onOkay(...);
          }
      } else {
          if (getActivity() instanceof Listener) {
              ((Listener)getActivity()).onCancel();
          }
      }
  }
}

class MyActivity extends Activity implements MyDialogFragment.Listener {
  ...
  @Override
  public void onOkay(MyObject result) {
    // update activity view here with result
  }

  @Override
  public void onCancel() {
    // anything?
  }
}

if your case, the "result" passed into the onOkay() method would be the Date object picked by the user in the dialog.




回答4:


A Fragment is not a View. If you want to find a fragment, use findFragmentById from the FragmentManager.



来源:https://stackoverflow.com/questions/14024921/retrieve-and-set-data-from-dialogfragment-datepicker

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!