AppCompatSpinner 的条目在第二次选择时不会打开 TimePickerDialog。请查看详情
AppCompatSpinner's entries not opening TimePickerDialog on selecting it second time. Please see details
我有以下作为 AppCompatSpinner
的条目:
<string-array name="startTimeList">
<item>Now</item>
<item>Pick a time..</item>
</string-array>
选择 Pick a time..
后,会打开 TimePickerDialog
并允许用户选择时间。方法如下:
startTimeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
// startTimeString = adapterView.getItemAtPosition(i).toString();
DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss");
userAvailableTimeInSF = currentDateFormat.format(new Date());
final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView();
startTimeSpinnerTV.setText(userAvailableTimeInSF);
switch (i) {
case 0:
userAvailableTimeInSF = currentDateFormat.format(new Date());
startTimeSpinnerTV.setText("Now");
break;
default:
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
TimePickerDialog timePickerDialog = new TimePickerDialog(PostSportRequest.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR_OF_DAY, hourOfDay);
date.set(Calendar.MINUTE, minute);
date.set(Calendar.AM_PM, date.get(Calendar.AM_PM));
showTime(hourOfDay, minute);
userAvailableTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime());
startTimeSpinnerTV.setText(userAvailableTimeAMPM);
Toast.makeText(getBaseContext(), "userAvailableTimeInSF: " + userAvailableTimeInSF, Toast.LENGTH_SHORT).show();
}
}, mHour, mMinute, false);
timePickerDialog.show();
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
第一次选择Pick a time..
时,TimePickerDialog成功打开并显示了选择的时间,但是当我再次选择它或再次点击它时,没有任何反应!
我不知道为什么!
请告诉我如何打开 TimePickerDialog 并选择时间,无论我 select/click 它多少次。
Spinner(或者实际上是 AdapterView,它的超类)仅在选择更改时触发 OnItemSelectedListener。
当您的用户选择 "Pick a time..." 时,微调器假定它是一个已选择的选项,并且如果再次被选择则不会再调用侦听器。但是,您可以注意到,如果选择 "Pick a time...",则选择 "Now",然后选择 "Pick a time...",将出现对话框。
我建议不要在您的案例中使用 Spinner(并且对所选视图做一些奇怪的事情)。您可以简单地使用显示所选时间的 TextView 和两个按钮完成相同的操作 - 一个用于显示对话框,一个用于将时间重置为现在。
按照以下步骤操作:
创建自定义微调器class
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
public class SpinnerOnSameSelection extends Spinner {
OnItemSelectedListener listener;
private AdapterView<?> lastParent;
private View lastView;
private long lastId;
public SpinnerOnSameSelection(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initlistner();
}
@Override
public void setSelection(int position) {
if (position == getSelectedItemPosition() && listener != null) {
listener.onItemSelected(lastParent, lastView, position, lastId);
} else {
super.setSelection(position);
}
}
private void initlistner() {
// TODO Auto-generated method stub
super.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
lastParent = parent;
lastView = view;
lastId = id;
if (listener != null) {
listener.onItemSelected(parent, view, position, id);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
if (listener != null) {
listener.onNothingSelected(parent);
}
}
});
}
public void setOnItemSelectedEvenIfUnchangedListener(
OnItemSelectedListener listener) {
this.listener = listener;
}
}
在您的 activity
中创建 onItemSelectedListener
private AdapterView.OnItemSelectedListener listener;
listener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View arg1,
int i, long arg3) {
//startTimeString = adapterView.getItemAtPosition(i).toString();
DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss");
userAvailableTimeInSF = currentDateFormat.format(new Date());
final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView();
startTimeSpinnerTV.setText(userAvailableTimeInSF);
switch (i) {
case 0:
// userAvailableTimeInSF = currentDateFormat.format(new Date());
startTimeSpinnerTV.setText("Now");
break;
case 1:
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR_OF_DAY, hourOfDay);
date.set(Calendar.MINUTE, minute);
date.set(Calendar.AM_PM, date.get(Calendar.AM_PM));
//showTime(hourOfDay, minute);
/* userAvailableTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime());
startTimeSpinnerTV.setText(userAvailableTimeAMPM);*/
Toast.makeText(getBaseContext(), "userAvailableTimeInSF: " + userAvailableTimeInSF, Toast.LENGTH_SHORT).show();
}
}, mHour, mMinute, false);
timePickerDialog.show();
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
};
}
将侦听器对象添加到自定义微调器方法
SpinnerOnSameSelection startTimeSpinner;
in onCreate(): startTimeSpinner = (SpinnerOnSameSelection) findViewById(R.id.idOfItemInXml);
startTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(listener);
在您的 xml
文件中
<your_package_name.SpinnerOnSameSelection
android:id="@+id/startTimeSpinner"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:entries="@array/mList">
</your_package_name.SpinnerOnSameSelection>
我有以下作为 AppCompatSpinner
的条目:
<string-array name="startTimeList">
<item>Now</item>
<item>Pick a time..</item>
</string-array>
选择 Pick a time..
后,会打开 TimePickerDialog
并允许用户选择时间。方法如下:
startTimeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
// startTimeString = adapterView.getItemAtPosition(i).toString();
DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss");
userAvailableTimeInSF = currentDateFormat.format(new Date());
final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView();
startTimeSpinnerTV.setText(userAvailableTimeInSF);
switch (i) {
case 0:
userAvailableTimeInSF = currentDateFormat.format(new Date());
startTimeSpinnerTV.setText("Now");
break;
default:
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
TimePickerDialog timePickerDialog = new TimePickerDialog(PostSportRequest.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR_OF_DAY, hourOfDay);
date.set(Calendar.MINUTE, minute);
date.set(Calendar.AM_PM, date.get(Calendar.AM_PM));
showTime(hourOfDay, minute);
userAvailableTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime());
startTimeSpinnerTV.setText(userAvailableTimeAMPM);
Toast.makeText(getBaseContext(), "userAvailableTimeInSF: " + userAvailableTimeInSF, Toast.LENGTH_SHORT).show();
}
}, mHour, mMinute, false);
timePickerDialog.show();
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
第一次选择Pick a time..
时,TimePickerDialog成功打开并显示了选择的时间,但是当我再次选择它或再次点击它时,没有任何反应!
我不知道为什么!
请告诉我如何打开 TimePickerDialog 并选择时间,无论我 select/click 它多少次。
Spinner(或者实际上是 AdapterView,它的超类)仅在选择更改时触发 OnItemSelectedListener。
当您的用户选择 "Pick a time..." 时,微调器假定它是一个已选择的选项,并且如果再次被选择则不会再调用侦听器。但是,您可以注意到,如果选择 "Pick a time...",则选择 "Now",然后选择 "Pick a time...",将出现对话框。
我建议不要在您的案例中使用 Spinner(并且对所选视图做一些奇怪的事情)。您可以简单地使用显示所选时间的 TextView 和两个按钮完成相同的操作 - 一个用于显示对话框,一个用于将时间重置为现在。
按照以下步骤操作:
创建自定义微调器class
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
public class SpinnerOnSameSelection extends Spinner {
OnItemSelectedListener listener;
private AdapterView<?> lastParent;
private View lastView;
private long lastId;
public SpinnerOnSameSelection(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initlistner();
}
@Override
public void setSelection(int position) {
if (position == getSelectedItemPosition() && listener != null) {
listener.onItemSelected(lastParent, lastView, position, lastId);
} else {
super.setSelection(position);
}
}
private void initlistner() {
// TODO Auto-generated method stub
super.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
lastParent = parent;
lastView = view;
lastId = id;
if (listener != null) {
listener.onItemSelected(parent, view, position, id);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
if (listener != null) {
listener.onNothingSelected(parent);
}
}
});
}
public void setOnItemSelectedEvenIfUnchangedListener(
OnItemSelectedListener listener) {
this.listener = listener;
}
}
在您的 activity
中创建onItemSelectedListener
private AdapterView.OnItemSelectedListener listener;
listener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View arg1,
int i, long arg3) {
//startTimeString = adapterView.getItemAtPosition(i).toString();
DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss");
userAvailableTimeInSF = currentDateFormat.format(new Date());
final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView();
startTimeSpinnerTV.setText(userAvailableTimeInSF);
switch (i) {
case 0:
// userAvailableTimeInSF = currentDateFormat.format(new Date());
startTimeSpinnerTV.setText("Now");
break;
case 1:
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR_OF_DAY, hourOfDay);
date.set(Calendar.MINUTE, minute);
date.set(Calendar.AM_PM, date.get(Calendar.AM_PM));
//showTime(hourOfDay, minute);
/* userAvailableTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime());
startTimeSpinnerTV.setText(userAvailableTimeAMPM);*/
Toast.makeText(getBaseContext(), "userAvailableTimeInSF: " + userAvailableTimeInSF, Toast.LENGTH_SHORT).show();
}
}, mHour, mMinute, false);
timePickerDialog.show();
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
};
}
将侦听器对象添加到自定义微调器方法
SpinnerOnSameSelection startTimeSpinner;
in onCreate(): startTimeSpinner = (SpinnerOnSameSelection) findViewById(R.id.idOfItemInXml);
startTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(listener);
在您的 xml
文件中
<your_package_name.SpinnerOnSameSelection
android:id="@+id/startTimeSpinner"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:entries="@array/mList">
</your_package_name.SpinnerOnSameSelection>