如何创建微调,显示当前及未来30日期 [英] How to create Spinner to show current and next 30 dates
问题描述
我怎样才能创建一个日期微调,这说明在当前的EditText日期为微调默认和将来的日期(如,未来30天)
我用日期选取器在许多应用程序,所以我很熟悉日期选取器对话,但没有关于日期的微调任何想法。
注意结果
请不要告诉我如何风格的EditText为微调
编辑:1 所推荐的 @erakitin
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_date); 微调spinnerDateIn =(微调)findViewById(R.id.spinnerDateIn);
微调spinnerDateOut =(微调)findViewById(R.id.spinnerDateOut); spinnerDateIn.setAdapter(新CalendarSpinnerAdapter(SpinnerDateActivity.this,30));}
编辑:2 所推荐的 @erakitin
在新的更新
CalendarSpinnerAdapter mSpinnerDateInAdapter =新CalendarSpinnerAdapter(SpinnerDateActivity.this,30);
spinnerDate.setAdapter(mSpinnerDateInAdapter); spinnerDate.setOnItemSelectedListener(新AdapterView.OnItemSelectedListener(){
@覆盖
公共无效onItemSelected(适配器视图<>母公司,观景,INT位置,长的id){
spinnerDate.setSelection(位置);
} @覆盖
公共无效onNothingSelected(适配器视图<>母公司){ }
});
现在,试图让字符串选定项的值,但得到:<?code>的java.util.GregorianCalendar ,其中我在做什么错误
strDate = spinnerDate.getSelectedItem()的toString();
有转接头供微调
下面一个简单的例子。
公共类CalendarSpinnerAdapter延伸BaseAdapter { 私人SimpleDateFormat的mDateFormat =新的SimpleDateFormat(D MMM YYYY); 私人LayoutInflater mInflater;
私人日历mCalendar;
私人诠释mDayCount;
私人INT mLastRequestedDay = 0; 公共CalendarSpinnerAdapter(上下文的背景下,诠释DAYCOUNT){
mInflater = LayoutInflater.from(上下文);
mDayCount = DAYCOUNT;
mCalendar = Calendar.getInstance();
} @覆盖
公众诠释的getCount(){
返回mDayCount;
} @覆盖
公共日历的getItem(INT位置){
mCalendar.add(Calendar.DAY_OF_YEAR,位置 - mLastRequestedDay);
mLastRequestedDay =位置;
返回mCalendar;
} @覆盖
众长getItemId(INT位置){
返回的位置;
} @覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
如果(convertView == NULL){
convertView = mInflater.inflate(android.R.layout.simple_spinner_dropdown_item,父母,假);
} 日历项目=的getItem(位置);
((的TextView)convertView).setText(mDateFormat.format(item.getTimeInMillis())); 返回convertView;
} @覆盖
公共查看getDropDownView(INT位置,查看convertView,父母的ViewGroup){
返回getView(位置,convertView,父母);
}
}
如何用它来显示当前的日期和下次29天:
mDateSpinner.setAdapter(新CalendarSpinnerAdapter(getActivity(),30));
UPD:
我们应该在参数添加到适配器的构造函数来设置起始日期:
公共CalendarSpinnerAdapter(上下文的背景下,日历的startDate,诠释DAYCOUNT){
mInflater = LayoutInflater.from(上下文);
mDayCount = DAYCOUNT;
mCalendar = Calendar.getInstance();
mCalendar.setTimeInMillis(startDate.getTimeInMillis());
}
那么关于 spinnerDateIn
添加监听器,我们可以初始化第二微调:
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_date); 微调spinnerDateIn =(微调)findViewById(R.id.spinnerDateIn);
最后的微调spinnerDateOut =(微调)findViewById(R.id.spinnerDateOut); mSpinnerDateInAdapter =新CalendarSpinnerAdapter(SpinnerDateActivity.this,Calendar.getInstance(),30);
spinnerDateIn.setAdapter(mSpinnerDateInAdapter); spinnerDateIn.setOnItemSelectedListener(新AdapterView.OnItemSelectedListener(){
@覆盖
公共无效onItemSelected(适配器视图&LT;&GT;母公司,观景,INT位置,长的id){
日历dateIn = Calendar.getInstance();
dateIn.setTimeInMillis(mSpinnerDateInAdapter.getItem(位置).getTimeInMillis());
dateIn.add(Calendar.DAY_OF_YEAR,1); //添加1天
mSpinnerDateOutAdapter =新CalendarSpinnerAdapter(SpinnerDateActivity.this,dateIn,30);
spinnerDateOut.setAdapter(mSpinnerDateOutAdapter);
} @覆盖
公共无效onNothingSelected(适配器视图&LT;&GT;母公司){ }
});
}
我没有尝试这个code,但它应该工作。
UPD2:
spinnerDate.setSelection(位置)
收益日历
类的实例。如果你想获得选定的日期为字符串
你应该格式化。尝试使用下面的方法:
私人字符串getSelectedDateAsString(微调dateSpinner){
日历selectedDate =(日历)dateSpinner.getSelectedItem();
返回新的SimpleDateFormat(D MMM YYYY)格式(selectedDate.getTimeInMillis())。
}
How can I create a date Spinner, which shows current date in EditText as default and future dates in Spinner (like, for next 30 days)
I used date picker in many apps, so I am familiar with date picker dialog but don't have any idea about date spinner.
Note
Please don't tell me How to style EditText as Spinner
EDITED: 1 AS RECOMMENDED BY @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));
}
EDITED: 2 AS RECOMMENDED BY @erakitin
in new update
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) {
}
});
Now, trying to get value of selected Item in String but getting: java.util.GregorianCalendar
, where i am doing mistake ?
strDate = spinnerDate.getSelectedItem().toString();
There are a simple example of adapter for Spinner
below.
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);
}
}
How to use it for display current date and next 29 days:
mDateSpinner.setAdapter(new CalendarSpinnerAdapter(getActivity(), 30));
UPD:
We should add a parameter to adapter's constructor for setting the starting date:
public CalendarSpinnerAdapter(Context context, Calendar startDate, int dayCount) {
mInflater = LayoutInflater.from(context);
mDayCount = dayCount;
mCalendar = Calendar.getInstance();
mCalendar.setTimeInMillis(startDate.getTimeInMillis());
}
Then add listener for spinnerDateIn
where we can initialize the second spinner:
@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) {
}
});
}
I didn't try this code but it should work.
UPD2:
spinnerDate.setSelection(position)
returns Calendar
class instance. If you want to get selected date as String
you should format it. Try to use following method:
private String getSelectedDateAsString(Spinner dateSpinner) {
Calendar selectedDate = (Calendar) dateSpinner.getSelectedItem();
return new SimpleDateFormat("d MMM yyyy").format(selectedDate.getTimeInMillis());
}
这篇关于如何创建微调,显示当前及未来30日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!