그래서 내 앱에는 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 시간으로 변경해도 아무런 문제가 발생하지 않습니다.
을 한 가지 예외 ... 매번로 이제 완벽하게 작동, 그것은 항상 쇼 오전. PM으로 변경하면 작동하지만 버튼을 다시 클릭하면 AM이 다시 표시됩니다. 나는 이것을 더 자세히 살펴 보겠다. 아마도 Calendar.AM_PM을 지정하지 않았기 때문일 것이다. 다시 한번 감사드립니다. – Ronnie
mHour = now.get (Calendar.HOUR_OF_DAY); 대신에 mHour = now.get (Calendar.HOUR); in TimeDialogFragment.newInstance() –
Tyler에게 감사드립니다. 문제는 여전히 남아 있지만 대화 상자를 다시 불러 올 때마다 AM 또는 PM이 무작위로 표시됩니다. 일관성이 없습니다. 그래도 앱의 중요한 부분에 초점을두고 나중에 단계 요소로 돌아갈 것입니다. 고맙습니다. – Ronnie