常见的Android DatePicker小部件

时间:2015-05-25 06:51:19

标签: android datepicker

如何实现一个常见的android datepicker小部件,最好是在小部件包中,用于我的应用程序中的多个布局。所选日期的值将作为String变量传递,以保存在数据库中。我不想在为具有DatePicker的布局提供服务的每个活动中使用以下代码。

public class MainActivity extends Activity implements OnClickListener {

    //UI References
    private EditText etxtDate;

    private DatePickerDialog datePickerDailog;
    private SimpleDateFormat dateFormatter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dateFormatter = new SimpleDateFormat("dd-MM-yyyy", Locale.US);

        findViewsById();

        setDateTimeField();
    }

    private void findViewsById() {
        fromDateEtxt = (EditText) findViewById(R.id.etxt_fromdate);    
        fromDateEtxt.setInputType(InputType.TYPE_NULL);
        fromDateEtxt.requestFocus();

    }

    private void setDateTimeField() {
        etxt.setOnClickListener(this);

        Calendar newCalendar = Calendar.getInstance();
        datePickerDialog = new DatePickerDialog(this, new OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                Calendar newDate = Calendar.getInstance();
                newDate.set(year, monthOfYear, dayOfMonth);
                fromDateEtxt.setText(dateFormatter.format(newDate.getTime()));
            }

        },newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH), newCalendar.get(Calendar.DAY_OF_MONTH));

       }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View view) {
        if(view == etxtDate) {
            fromDatePickerDialog.show();
        }     
    }
}

2 个答案:

答案 0 :(得分:1)

为日期选择器对话框创建此类

public class DatePickerFragment extends DialogFragment {

OnDateSetListener dateSetListener;
private int year = 0;
private int month = 0;
private int day = 0;

public DatePickerFragment(OnDateSetListener dateSetListener) {
    this.dateSetListener = dateSetListener;
    // Use the current date as the default date in the picker
    final Calendar c = Calendar.getInstance();
    year = c.get(Calendar.YEAR);
    month = c.get(Calendar.MONTH);
    day = c.get(Calendar.DAY_OF_MONTH);
}

public DatePickerFragment(OnDateSetListener dateSetListener, String date) {
    this.dateSetListener = dateSetListener;
    // Use the Given date as the default date in the picker
    int parsedDate[] = new int[3];
    int itterator = 0;
    for (String retval : date.split("/")) {
        parsedDate[itterator] = Integer.parseInt(retval);
        itterator++;
    }
    day = parsedDate[0];
    month = parsedDate[1] - 1;
    year = parsedDate[2];
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    // Create a new instance of DatePickerDialog and return it
    return new DatePickerDialog(getActivity(), dateSetListener, year,
            month, day);
}

创建此类的对象并调用您必须为您想要的每个活动或片段创建日期监听器

DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {

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

            //your action after the date is selected
        }

    };

然后使用你的监听器调用日期选择器

datePicker = new DatePickerFragment(fromDateSetListener);

datePicker = new DatePickerFragment(fromDateSetListener,date);
//date is the string which will be shown on the date picker dialog by default

现在调用日期选择器对话框

datePicker.show(getChildFragmentManager(), "datePicker");

答案 1 :(得分:0)

尝试:

  1. 创建父活动并在此活动中包含此代码。
  2. 通过扩展此父活动,创建新活动(为具有DatePicker的布局提供服务的每个活动)。
  3. 这样您就可以在子活动中访问相同的代码了!