如何创建日期微调器,该日期将EditText中的当前日期显示为默认值,并在Spinner中显示将来的日期(例如接下来的30天)
我在许多应用程序中使用了日期选择器,因此我熟悉日期选择器对话框,但对日期微调器一无所知。
注意
请不要告诉我如何将EditText设置为Spinner
编辑:1以@erakitin推荐@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_date);
Spinner spinnerDateIn = (Spinner) findViewById(R.id.spinnerDateIn);
Spinner spinnerDateOut = (Spinner) findViewById(R.id.spinnerDateOut);
spinnerDateIn.setAdapter(new CalendarSpinnerAdapter(SpinnerDateActivity.this, 30));
}
编辑:2由@erakitin在新更新中推荐
CalendarSpinnerAdapter mSpinnerDateInAdapter = new CalendarSpinnerAdapter(SpinnerDateActivity.this, 30);
spinnerDate.setAdapter(mSpinnerDateInAdapter);
spinnerDate.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
spinnerDate.setSelection(position);
}
@Override
public void onNothingSelected(AdapterView> parent) {
}
});
现在,尝试获取String中选定项的值,但得到:java.util.GregorianCalendar,我在哪里出错?
strDate = spinnerDate.getSelectedItem().toString();
最佳答案
下面有一个简单的Spinner适配器示例。public class CalendarSpinnerAdapter extends BaseAdapter {
private SimpleDateFormat mDateFormat = new SimpleDateFormat("d MMM yyyy");
private LayoutInflater mInflater;
private Calendar mCalendar;
private int mDayCount;
private int mLastRequestedDay = 0;
public CalendarSpinnerAdapter(Context context, int dayCount) {
mInflater = LayoutInflater.from(context);
mDayCount = dayCount;
mCalendar = Calendar.getInstance();
}
@Override
public int getCount() {
return mDayCount;
}
@Override
public Calendar getItem(int position) {
mCalendar.add(Calendar.DAY_OF_YEAR, position - mLastRequestedDay);
mLastRequestedDay = position;
return mCalendar;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
}
Calendar item = getItem(position);
((TextView) convertView).setText(mDateFormat.format(item.getTimeInMillis()));
return convertView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}
}
如何使用它显示当前日期和 future 29天:
mDateSpinner.setAdapter(new CalendarSpinnerAdapter(getActivity(), 30));
UPD:
我们应该向适配器的构造函数添加一个参数以设置开始日期:
public CalendarSpinnerAdapter(Context context, Calendar startDate, int dayCount) {
mInflater = LayoutInflater.from(context);
mDayCount = dayCount;
mCalendar = Calendar.getInstance();
mCalendar.setTimeInMillis(startDate.getTimeInMillis());
}
然后为spinnerDateIn添加侦听器,我们可以在其中初始化第二个微调器:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_date);
Spinner spinnerDateIn = (Spinner) findViewById(R.id.spinnerDateIn);
final Spinner spinnerDateOut = (Spinner) findViewById(R.id.spinnerDateOut);
mSpinnerDateInAdapter = new CalendarSpinnerAdapter(SpinnerDateActivity.this, Calendar.getInstance(), 30);
spinnerDateIn.setAdapter(mSpinnerDateInAdapter);
spinnerDateIn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
Calendar dateIn = Calendar.getInstance();
dateIn.setTimeInMillis(mSpinnerDateInAdapter.getItem(position).getTimeInMillis());
dateIn.add(Calendar.DAY_OF_YEAR, 1); // add one day
mSpinnerDateOutAdapter = new CalendarSpinnerAdapter(SpinnerDateActivity.this, dateIn, 30);
spinnerDateOut.setAdapter(mSpinnerDateOutAdapter);
}
@Override
public void onNothingSelected(AdapterView> parent) {
}
});
}
我没有尝试此代码,但它应该可以工作。
UPD2:
spinnerDate.setSelection(position)返回Calendar类实例。如果要获取所选日期作为String,则应设置其格式。尝试使用以下方法:
private String getSelectedDateAsString(Spinner dateSpinner) {
Calendar selectedDate = (Calendar) dateSpinner.getSelectedItem();
return new SimpleDateFormat("d MMM yyyy").format(selectedDate.getTimeInMillis());
}