したがって、私のアプリには2つのボタンがあります。1 つは datepicker ダイアログ フラグメントを開き、もう 1 つは timepicker フラグメントを開きます。ボタンのテキストには、選択した日付と時刻が表示されます。日付ピッカーは完全に機能しますが、タイムピッカーでいくつかの問題が発生しています。これらはすべて関連している可能性があります。問題 1: ピッカーが 12 時間制に設定されており、AM または PM をクリックして切り替えると、アプリがクラッシュします (logcat は以下に貼り付けられます)。問題 2: 新しい時刻を選択した後、もう一度ボタンをクリックすると、タイムピッカーが最後に選択した時刻ではなく現在の時刻を表示することがあります。まったく異なる時間が表示されることがあります (たとえば、11.00 でクリックして 10.00 に変更します。もう一度ボタンをクリックすると、タイムピッカーが午後 6.00 に設定されます)。この動作を繰り返す方法が見つかりませんでした。問題 3:
ログキャット
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, minutes);」です。
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 を囲むコード- 具体的には mListener 行
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
mListener.updateChangedTime(hourOfDay, minute);
}
完全な PickerActivity.java ファイルから datepicker セクションを除いたものを次に示します。
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 時 50 分) ですが、23 時 50 分 (午後 11 時 50 分) を選択すると、上記と同じ logcat エラーでクラッシュします。別の AM 時間に変更しても問題はありません。