2012-07-29 7 views
0

그래서 내 앱에는 2 개의 버튼이 있습니다. 하나는 datepicker 대화 상자 조각을 열고 하나는 timepicker 조각을 엽니 다. 버튼 텍스트에는 선택한 날짜와 시간이 표시됩니다. 날짜 선택 도구가 완벽하게 작동하지만 시간 피커와 관련된 몇 가지 문제가 있습니다. 모든 문제가 관련 될 수 있습니다. 문제 1 : 선택 도구가 12 시간으로 설정되어 있고 AM 또는 PM을 클릭하여 해당 항목을 전환하면 응용 프로그램이 중단됩니다 (logcat이 아래에 붙여 넣어집니다). 문제 2 : 새 시간을 선택한 후 단추를 다시 누르면 마지막으로 선택한 시간 대신 현재 시간이 시간 지정기에 표시되는 경우가 있습니다. 때로는 완전히 다른 시간을 보여 주기도합니다 (예 : 11.00에서 클릭하고 10.00으로 변경). 버튼을 다시 클릭하면 시간 지정이 6.00pm으로 설정됩니다. 이 행동을 반복하는 방법을 찾지 못했습니다. 문제 3 : 시간이 맞으면 (시와 분) 올바른 AM/PM 버튼이 잘못된 선택에있는 경우가 있습니다.AM에서 PM으로 바뀔 때 시간 선택기가 충돌합니다.

로그 캣

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, 분);"

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에서 선 (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 파일을 뺀 날짜 선택기 섹션입니다 다음은 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 텍스트를 포함하고 싶지만 위의 문제가 해결되면 이러한 문제를 직접 해결할 수있어서 기쁩니다. 어떤 도움을 주셔서 감사합니다. 반대 AM/PM 브래킷에서 시간을 선택할 때 내가

return new TimePickerDialog(mContext, mTimeSetListener, mHour, mMinute, false); 

TimeDialogFragment.java 파일에

return new TimePickerDialog(mContext, mTimeSetListener, mHour, mMinute, true); 

에 변경하면 바로 위뿐만 아니라

는 즉시 충돌 예 : 지금은 0.50 (12.50am)이지만 23.50 (11.50pm)을 선택하면 위와 같은 logcat 오류로 인해 충돌합니다. 다른 AM 시간으로 변경해도 아무런 문제가 발생하지 않습니다.

답변

1

일정 시간을 업데이트 할 때 다음과 같이 그것이 있어야 : 나는 timepicker를 불러 버튼을 클릭 ... 환상적인

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

을 한 가지 예외 ... 매번로 이제 완벽하게 작동, 그것은 항상 쇼 오전. PM으로 변경하면 작동하지만 버튼을 다시 클릭하면 AM이 다시 표시됩니다. 나는 이것을 더 자세히 살펴 보겠다. 아마도 Calendar.AM_PM을 지정하지 않았기 때문일 것이다. 다시 한번 감사드립니다. – Ronnie

+0

mHour = now.get (Calendar.HOUR_OF_DAY); 대신에 mHour = now.get (Calendar.HOUR); in TimeDialogFragment.newInstance() –

+0

Tyler에게 감사드립니다. 문제는 여전히 남아 있지만 대화 상자를 다시 불러 올 때마다 AM 또는 PM이 무작위로 표시됩니다. 일관성이 없습니다. 그래도 앱의 중요한 부분에 초점을두고 나중에 단계 요소로 돌아갈 것입니다. 고맙습니다. – Ronnie

관련 문제