2012-07-29 61 views
0

所以我的應用程序有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時間不會導致任何問題。

回答

1

當更新時間日曆,它應該是如下:

public void updateChangedTime(int hourOfDay, int minute) { 
    buttonTime.setText(String.valueOf(hourOfDay) + ":" + String.valueOf(minute)); 
    now.set(Calendar.HOUR_OF_DAY, hourOfDay); 
    now.set(Calendar.MINUTE, minute); 
} 
+0

神奇......但有一個例外......現在每次完美的作品我按一下按鈕,彈出timepicker,它總是顯示上午。更改爲PM作品,但如果再次單擊該按鈕,它會再次顯示AM。我會進一步研究這個,因爲它可能是由於我沒有指定'Calendar.AM_PM'再次感謝。 – Ronnie 2012-07-30 09:36:47

+0

使用mHour = now.get(日曆。HOUR_OF_DAY);而不是mHour = now.get(Calendar.HOUR);在TimeDialogFragment.newInstance() – 2012-08-01 06:24:00

+0

謝謝泰勒。問題仍然存在,但無論何時我再次提起對話,它都會隨機顯示AM或PM;這並不一致。我將專注於應用程序的一些更重要的領域,並在稍後階段回到時間元素。謝謝。 – Ronnie 2012-08-03 10:15:31