簡體   English   中英

如何使用Datepicker對話框拖動不同的EditText

[英]How to used datepicker dialogdragment different edittext

我有從DialogFragment擴展的DatepickerFragment。 在我的主要片段中,有兩個edittext。第一個用於開始日期,第二個用於完成日期。 這些是針對某些用戶操作的。用戶單擊第一個edittext選擇日期,而另一個單擊的方式相同,但是我對如何處理DatepickerFragment上的edittext感到困惑。什么是最佳方法?

    etOverFlowingStaringDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            FragmentManager fragmentManager = getActivity().getFragmentManager();
            DatePickerFragment datePickerFragment = new DatePickerFragment();
            datePickerFragment.show(fragmentManager, "datepicker");
        }
    });

DatepickerFragment.java

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    @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 monthOfYear, int dayOfMonth) {
        populateSetDate(year, monthOfYear+1, dayOfMonth);
    }

    private void populateSetDate(int year, int month, int dayOfMonth) {

       String datetime = dayOfMonth + "/" + month + "/" + year ;

        //EditText edtext = (EditText)getView().findViewById(R.id.overflow_starting_date);
        // The edittext is changable it is not a good way to define in here

    }
}

我通常會在一個單獨的類中創建自定義DatePickerFragment ,然后使用Listener模型來實現您要實現的目標。 實質上:

在您的DatePickerFragment中,定義一個接口-

public interface OnDateChosenListener {
    void onDateChosen(int year, int month, int day);
}

然后,在DatePickerFragment類中為該接口定義一個私有變量-

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    private OnDateChosenListener mOnDateChosenListener = null;

    ...

添加一個函數來設置OnDateChosenListener-

public void setOnDateChosenListener(OnDateChosenListener listener) {
    mOnDateChosenListener = listener;
}

DatePickerFragment類的最后一件事,將事件和值傳遞給偵聽器(如果存在)-

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    if (mOnDateChosenListener != null) {
        mOnDateChosenListener.onDateChosen(year, monthOfYear, dayOfMonth);
    }
}

最后,最重要。 請記住,無論您在何處使用新的DatePickerFragment,都應添加一個偵聽器,在這種情況下,就是一個Activity-

FragmentManager fragmentManager = getActivity().getFragmentManager();
DatePickerFragment datePickerFragment = new DatePickerFragment();
datePickerFragment.addOnDateChosenListener(new OnDateChosenListener() {
    public void onDateChosen(int year, int month, int day) {
        // use values to change EditText value
    }
}
datePickerFragment.show(fragmentManager, "datepicker");

偵聽器模型是一種很好的做法,已在Android框架中廣泛使用。

我不確定我是否很好地理解了您的問題,但是一旦用戶選擇了它,您是否要在EditText上獲取日期? 如果是這樣的話

創建一個界面,該界面將在您的活動/片段中接收您的日期:

interface DateReceiver {
    void update(int year, int month, int day); 
}

實現您的活動/片段,然后實現方法:

@Override
public void update(int year, int month, int day) {
     String date = //format your date here;
     this.editText.setText(date);
}

如果添加了onClickListener您EDITTEXT ...:

etOverFlowingStaringDate.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DatePickerFragment fragment = new DatePickerFragment();
        fragment.setReceiver(MainActivity.this); //assuming your activity is called MainActivity.this. 'this' alone won't work.
        fragment.show(this.getFragmentManager(), "datePicker"); //do getActivity().getFragmentManager in a Fragment
    }
});

您可能已經注意到,我編寫了fragment.setReceiver(MainActivity.this) 此方法在下面創建和定義。

然后,您應該通過實現DatePickerFragment來實現以下目的:

public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    private DateReceiver receiver;
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int year = TransactionUtils.getFragment().mYearChosen;
        int month = TransactionUtils.getFragment().mMonthChosen;
        int day = TransactionUtils.getFragment().mDayChosen;

        //If you want the minimum date to be today...
        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), this, year, month, day);
        datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
        return datePickerDialog;
    }

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        updateDate(year, monthOfYear, dayOfMonth);
    }

    public void setReceiver(DateReceiver receiver) {
        this.receiver = receiver;
    }

    private void updateDate(int year, int monthOfYear, int dayOfMonth) {
        if (receiver != null) //avoiding NullPointerExceptions :D
              receiver.update(year, monthOfYear, dayOfMonth);
    }
}

private void updateDate(int,int,int)調用update會更改editText的日期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM