所以我的應用程序有2個按鈕。一個打開datepicker對話框片段和一個打開timepicker片段的對象片段。按鈕文本顯示選定的日期和時間。日期選取器完美地工作,但我遇到了與時間選取器有關的幾個問題,這可能都是相關的。 問題1:選擇器設置爲12小時,點擊AM或PM在它們之間切換會導致應用程序崩潰(logcat將被粘貼到下面)。 問題2:選擇新時間後,如果再次點擊該按鈕,時間選擇器有時會顯示當前時間而不是最後選擇的時間。有時它顯示完全不同的小時(例如,我點擊它在11.00,並將其更改爲10.00。當我再次單擊該按鈕時,時間選擇器設置爲6.00pm)。我還沒有找到重複這種行爲的方式。 問題3:即使時間正確(小時和分鐘)正確,AM/PM按鈕有時也會出現錯誤選擇。時間選擇器在從AM更改爲PM時崩潰
logcat的
07-29 23:59:03.483: E/Trace(2167): error opening trace file: No such file or directory (2)
07-29 23:59:12.703: E/AndroidRuntime(2167): FATAL EXCEPTION: main
07-29 23:59:12.703: E/AndroidRuntime(2167): java.lang.ArrayIndexOutOfBoundsException: length=17; index=23
07-29 23:59:12.703: E/AndroidRuntime(2167): at java.util.Calendar.set(Calendar.java:1210)
07-29 23:59:12.703: E/AndroidRuntime(2167): at com.rone.datetimepractice.PickerActivity$2.updateChangedTime(PickerActivity.java:71)
07-29 23:59:12.703: E/AndroidRuntime(2167): at com.rone.datetimepractice.TimeDialogFragment$1.onTimeSet(TimeDialogFragment.java:46)
07-29 23:59:12.703: E/AndroidRuntime(2167): at android.app.TimePickerDialog.tryNotifyTimeSet(TimePickerDialog.java:130)
07-29 23:59:12.703: E/AndroidRuntime(2167): at android.app.TimePickerDialog.onClick(TimePickerDialog.java:115)
07-29 23:59:12.703: E/AndroidRuntime(2167): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
07-29 23:59:12.703: E/AndroidRuntime(2167): at android.os.Handler.dispatchMessage(Handler.java:99)
07-29 23:59:12.703: E/AndroidRuntime(2167): at android.os.Looper.loop(Looper.java:137)
07-29 23:59:12.703: E/AndroidRuntime(2167): at android.app.ActivityThread.main(ActivityThread.java:4745)
07-29 23:59:12.703: E/AndroidRuntime(2167): at java.lang.reflect.Method.invokeNative(Native Method)
07-29 23:59:12.703: E/AndroidRuntime(2167): at java.lang.reflect.Method.invoke(Method.java:511)
07-29 23:59:12.703: E/AndroidRuntime(2167): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-29 23:59:12.703: E/AndroidRuntime(2167): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-29 23:59:12.703: E/AndroidRuntime(2167): at dalvik.system.NativeStart.main(Native Method)
從PickerActivity 71周圍線路代碼 - 確切的行是 「now.set(HOUROFDAY,分鐘);」從TimeDialogFragment周圍線46
public void showDialogTime() {
FragmentTransaction ftTime = getFragmentManager().beginTransaction();
fragTime = TimeDialogFragment.newInstance(this, new TimeDialogFragmentListener() {
public void updateChangedTime(int hourOfDay, int minute) {
buttonTime.setText(String.valueOf(hourOfDay)+":"+String.valueOf(minute));
now.set(hourOfDay, minute);
}}, now);
fragTime.show(ftTime, "TimeDialogFragment");
}
碼 - 特別是mListener線
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
mListener.updateChangedTime(hourOfDay, minute);
}
以下是完整的PickerActivity.java文件減去日期選擇器部分:
public class PickerActivity extends Activity {
TimeDialogFragment fragTime;
Button buttonDate, buttonTime;
Calendar now;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
now = Calendar.getInstance();
buttonTime = (Button) findViewById(R.id.time_button);
buttonTime.setText(String.valueOf(now.get(Calendar.HOUR))+":"+
String.valueOf(now.get(Calendar.MINUTE)));
}
public void clickMe(View v) {
int id = v.getId();
switch (id) {
case R.id.date_button :
showDialogDate();
break;
case R.id.time_button :
showDialogTime();
break;
default:
break;
}}
public interface TimeDialogFragmentListener {
public void updateChangedTime(int hourOfDay, int minute);
}
public void showDialogTime() {
FragmentTransaction ftTime = getFragmentManager().beginTransaction();
fragTime = TimeDialogFragment.newInstance(this, new TimeDialogFragmentListener() {
public void updateChangedTime(int hourOfDay, int minute) {
buttonTime.setText(String.valueOf(hourOfDay)+":"+String.valueOf(minute));
now.set(hourOfDay, minute);
}}, now);
fragTime.show(ftTime, "TimeDialogFragment");
}}
這是TimeDialogFragment.java文件:
public class TimeDialogFragment extends DialogFragment {
static Context mContext;
static int mHour;
static int mMinute;
static TimeDialogFragmentListener mListener;
public static TimeDialogFragment newInstance(Context context,
TimeDialogFragmentListener listener, Calendar now) {
TimeDialogFragment dialog = new TimeDialogFragment();
mContext = context;
mListener = listener;
mHour = now.get(Calendar.HOUR);
mMinute = now.get(Calendar.MINUTE);
Bundle args = new Bundle();
args.putString("title", "Set Time");
dialog.setArguments(args);
return dialog;
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new TimePickerDialog(mContext, mTimeSetListener, mHour, mMinute, false);
}
private TimePickerDialog.OnTimeSetListener mTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
mListener.updateChangedTime(hourOfDay, minute);
}};}
如果這讓我們如何處理這個有什麼區別,我不打算將時間保存到我的數據庫,所以我可以按時間排序的結果,以及允許用戶更改時間的任何數據庫行/記錄到任何他們選擇的時間。我還想在按鈕上添加AM/PM文本,但一旦上述問題得到解決,我很樂意自己解決這些問題。任何幫助表示讚賞。
剛剛在除了上述,如果我改變
return new TimePickerDialog(mContext, mTimeSetListener, mHour, mMinute, false);
到
return new TimePickerDialog(mContext, mTimeSetListener, mHour, mMinute, true);
在TimeDialogFragment.java文件,它在相反的AM/PM選擇托架一小時時立即崩潰,例如。現在是0.50(12.50am),但是如果我選擇23.50(11.50pm),它會崩潰,並出現與上面相同的logcat錯誤。更改爲另一個AM時間不會導致任何問題。
神奇......但有一個例外......現在每次完美的作品我按一下按鈕,彈出timepicker,它總是顯示上午。更改爲PM作品,但如果再次單擊該按鈕,它會再次顯示AM。我會進一步研究這個,因爲它可能是由於我沒有指定'Calendar.AM_PM'再次感謝。 – Ronnie 2012-07-30 09:36:47
使用mHour = now.get(日曆。HOUR_OF_DAY);而不是mHour = now.get(Calendar.HOUR);在TimeDialogFragment.newInstance() – 2012-08-01 06:24:00
謝謝泰勒。問題仍然存在,但無論何時我再次提起對話,它都會隨機顯示AM或PM;這並不一致。我將專注於應用程序的一些更重要的領域,並在稍後階段回到時間元素。謝謝。 – Ronnie 2012-08-03 10:15:31