定位更改后,Android TimePicker小时字段将消失

我正在使用API​​ 1.5下的TimePicker,当我的设备(库存G1运行1.6 – 虽然不在1.5 / 1.6仿真器上)上更改方向时,小时字段将变为空白。 它还记得那个小时,它只是没有显示出来。 有没有解决方法?

同样的问题在这里被其他人描述:

http://groups.google.com/group/android-beginners/browse_thread/thread/b4288004021b876/de5899a2bb291ab5

没有什么有用的即将到来 – 可以StackOverflow更好吗?

Solutions Collecting From Web of "定位更改后,Android TimePicker小时字段将消失"

只需将TimePicker.setCurrentHour和TimePicker.setCurrentMinute方法调用到Activity的onResume方法即可。

如前所述,重写onResume()方法将对此问题进行sorting。

@Override public void onResume() { super.onResume(); TimePicker tmp = (TimePicker) this.findViewById(R.id.yourTimePicker); tmp.setCurrentHour(7); // This will also set on rotate } 

看看这个: http : //code.google.com/p/android/issues/detail?id=22824无论你做什么,你将无法解决问题,而不会破坏活动,并重新创build时发生旋转。 为了不进入无限循环,简单地检查onCreate中是否存在savedInstanceState!= null。 像这样的东西将工作:

 if (savedInstanceState!=null){ Intent myIntent = new Intent(getApplicationContext(), CurrentClassName.class); startActivityForResult(myIntent, 0); finish(); } 

在您的活动的onSaveInstanceState()中,从TimePicker获取小时值并将其放入Bundle 。 在您的活动的onRestoreInstanceState()中,将小时从Bundle取出并放入TimePicker

TimePicker应该自行处理,但这可能会解决您的问题。

我已经失去了很多的睡眠,只是弄明白了。 在使用DialogPreference时,需要重写showDialog方法,并在那里重置currentHour和currentMinute。 喜欢这个:

 @Override protected void showDialog(Bundle state) { super.showDialog(state); mBeginShiftTp.setCurrentHour(mBeginShiftTp.getCurrentHour()); mBeginShiftTp.setCurrentMinute(mBeginShiftTp.getCurrentMinute()); mEndShiftTp.setCurrentHour(mEndShiftTp.getCurrentHour()); mEndShiftTp.setCurrentMinute(mEndShiftTp.getCurrentMinute()); 

}

根据DanRoss提供的链接,如果时间没有改变,则问题与select器不更新小时有关。 关于方向更改,这种行为是错误的,因为旋转之前的小时总是等于旋转之后的小时。

对于那些使用TimePickerDialog ,解决这个问题的方法是扩展默认实现,并通过更新时间(在本例中设置小时和分钟等于0)强制更新小时, 然后将小时更新为实际小时。

仅使用TimePicker控件就可以构build类似的东西。

这是TimePickerDialog的一个工作示例:

 import android.content.Context; import android.os.Bundle; import android.widget.TimePicker; public class TimePickerDialog extends android.app.TimePickerDialog { private final String HOUR_KEY = "Hour"; private final String MINUTE_KEY = "Minute"; private int hourOfDay; private int minute; public TimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) { super(context, callBack, hourOfDay, minute, is24HourView); this.hourOfDay = hourOfDay; this.minute = minute; } @Override public void onTimeChanged (TimePicker view, int hourOfDay, int minute) { super.onTimeChanged(view, hourOfDay, minute); this.hourOfDay = hourOfDay; this.minute = minute; } @Override public Bundle onSaveInstanceState() { Bundle savedInstanceState = super.onSaveInstanceState(); if (savedInstanceState == null) { savedInstanceState = new Bundle(); } savedInstanceState.putInt(HOUR_KEY, this.hourOfDay); savedInstanceState.putInt(MINUTE_KEY, minute); return savedInstanceState; } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // The code for updating the hour is currently not doing anything // if the hour has not changed. // Force it to update by setting it to zero first this.updateTime(0, 0); this.hourOfDay = savedInstanceState.getInt(HOUR_KEY); this.minute = savedInstanceState.getInt(MINUTE_KEY); // Now it will update this.updateTime(this.hourOfDay, this.minute); } } 

这个bug与Android官方论坛错误5483有关 。 那么,这个讨论,他们提出了一个简单的解决scheme,它适用于我。 我在AndroidManifest.xml Activity上添加了属性android:onConfigurationChanges=orientation

重要:根据您的活动(其他小工具…),它可能有副作用

我意识到晚会有点迟,但是看到这个问题依然存在,我觉得值得一个实际的答案。

从我在别处读到的,这个问题与TimePicker的个体号码字段都有完全相同的ID。 这是一个问题,因为当你旋转屏幕时,androidclosures所有的对话框,使用典型的onCreateDialog – > onPrepareDialog重新打开所有的对话框,然后,最重要的是, 在你做对话之后,它会返回通过并恢复曾经在那里。 这意味着不pipe你事先做了什么,android都会打开你的TimePicker。

答案虽然不是最漂亮的select,但是在android之后进入并重新设置。

下面是我做的,我只是做了我自己的TimePicker:

 public class MyTimePicker extends TimePicker { public MyTimePicker(Context context) { super(context); } public MyTimePicker(Context context, AttributeSet attrs) { super(context, attrs); } public MyTimePicker(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private final static String B_MIN = "bMin"; private final static String B_HOUR = "bHour"; private final static String B_SUPER = "bSuper"; // here's the first key, we're going to override how the TimePicker saves // its state @Override public Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); bundle.putParcelable(B_SUPER, super.onSaveInstanceState()); bundle.putInt(B_MIN, getCurrentMinute()); bundle.putInt(B_HOUR, getCurrentHour()); return bundle; } // this function gets called when we are restoring, but before android // does its thing @Override public void onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) { final Bundle bundle = (Bundle) state; super.onRestoreInstanceState(bundle.getParcelable(B_SUPER)); // here it is, not the prettiest option, but it gets the job done // we simply wait 0.1 sec and then update the TimePicker // since all of this happens in the same thread, its guarenteed to // be after the android reset // also, this handler gets the HandlerLeak warning, I don't // think this can leak though seeing as it's only called once // with a 100 ms delay (new Handler() { @Override public void handleMessage(Message msg) { setCurrentMinute(bundle.getInt(B_MIN)); setCurrentHour(bundle.getInt(B_HOUR)); } }).sendEmptyMessageDelayed(0, 100); return; } super.onRestoreInstanceState(state); } } 

是的,处理程序是必要的。 如果你只是从onRestoreInstanceState运行setCurrent命令,android会简单地覆盖你。

我看到这个问题是积极的更早,但我解决了问题,如果有人有这个问题,这是解决的:一切都在onResume(),首先得到小时的价值,然后设置hourPicker小时+ 1,然后设置为小时。 这对我有用。

有效的疯狂解决scheme:

  • 在onResume()中运行AsynTask
  • 睡眠50毫秒
  • 切换回UI线程,使用Activity.runOnUiThread()
  • 在UI线程设置分钟/小时为0
  • 然后设置分钟/小时为您的值

这是代码的要点,准备复制粘贴:)
https://gist.github.com/sorrro/9415702