我有一个包含编辑文本的对话框片段。这些编辑文本将允许用户输入有关事件的信息,即eventName,eventStartDate,eventStartTime,eventEndDate和eventEndTime。
单击“添加”或“正”按钮时,日期和时间的信息将作为字符串获取,然后将这些字符串拆分,以便将信息作为单个变量获取。然后将这些变量转换为int值。
然后我希望将这些int值放入我设置的SQLiteDatabase中。所以我将值传递给insertRow()方法。
这是DialogFragment类:
private class EventDetailsDialogFragment
{
public Dialog onCreateDialogFragment(final Bundle savedInstanceState, Calendar time)
{
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
builder.setView(inflater.inflate(R.layout.dialog_event_details, null));
builder.setTitle("Empty time clicked:\n" + String.valueOf(time.getTime()))
.setPositiveButton("Add", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
String name = "";
int startYear, startMonth, startDay, startHour, startMinute;
int endYear, endMonth, endDay, endHour, endMinute;
EditText eventName = (EditText)findViewById(R.id.editTextEventName);
EditText eventStartDate = (EditText) findViewById(R.id.editTextEventStartDate);
EditText eventStartTime = (EditText) findViewById(R.id.editTextEventStartTime);
EditText eventEndDate = (EditText) findViewById(R.id.editTextEventEndDate);
EditText eventEndTime = (EditText) findViewById(R.id.editTextEventEndTime);
String [] startDate = String.valueOf(eventStartDate).split("/");
String [] startTime = String.valueOf(eventStartTime).split(":");
String [] endDate = String.valueOf(eventEndDate).split("/");
String [] endTime = String.valueOf(eventEndTime).split(":");
name = String.valueOf(eventName);
startYear = Integer.parseInt(startDate[2]);
startMonth = Integer.parseInt(startDate[1]);
startDay = Integer.parseInt(startDate[0]);
startHour = Integer.parseInt(startTime[0]);
startMinute = Integer.parseInt(startTime[1]);
endYear = Integer.parseInt(endDate[2]);
endMonth = Integer.parseInt(endDate[1]);
endDay = Integer.parseInt(endDate[0]);
endHour = Integer.parseInt(endTime[0]);
endMinute = Integer.parseInt(endTime[1]);
long newId = myDatabase.insertRow(name, startYear, startMonth, startDay, startHour,
startMinute, endYear, endMonth, endDay, endHour, endMinute);
}
}).setNeutralButton("Show Events", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
Cursor cursor = myDatabase.getAllRows();
displayRecordSet(cursor);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
return builder.create();
}
}
当我进入应用程序并弹出对话框时,我输入了一个事件的信息。例如,(Database Systems Exam,04/03 / 2015,15:00,04 / 03 / 2015,17:30)。然后,当单击添加按钮时,应用程序将停止工作。
我进入了LogCat,这是它给我的错误:
03-23 20:03:08.676: E/AndroidRuntime(816): FATAL EXCEPTION: main
03-23 20:03:08.676: E/AndroidRuntime(816): java.lang.ArrayIndexOutOfBoundsException: length=1; index=2
03-23 20:03:08.676: E/AndroidRuntime(816): at com.example.davidnkanga.sample.MainActivity$EventDetailsDialogFragment$3.onClick(MainActivity.java:174)
03-23 20:03:08.676: E/AndroidRuntime(816): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
03-23 20:03:08.676: E/AndroidRuntime(816): at android.os.Handler.dispatchMessage(Handler.java:99)
03-23 20:03:08.676: E/AndroidRuntime(816): at android.os.Looper.loop(Looper.java:137)
03-23 20:03:08.676: E/AndroidRuntime(816): at android.app.ActivityThread.main(ActivityThread.java:5103)
03-23 20:03:08.676: E/AndroidRuntime(816): at java.lang.reflect.Method.invokeNative(Native Method)
03-23 20:03:08.676: E/AndroidRuntime(816): at java.lang.reflect.Method.invoke(Method.java:525)
03-23 20:03:08.676: E/AndroidRuntime(816): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-23 20:03:08.676: E/AndroidRuntime(816): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-23 20:03:08.676: E/AndroidRuntime(816): at dalvik.system.NativeStart.main(Native Method)
我主要活动的第174行是:
startYear = Integer.parseInt(startDate[2]);
我已经尝试了很多方法将字符串转换为int但无效。
答案 0 :(得分:0)
这不是因为您正在将String
转换为int
。您的startDate
数组的长度为1,但您正在从中访问索引2。因此,将数组的长度更改为您将在代码中访问的值。
以下是解决方案
EditText eventStartDate = (EditText) findViewById(R.id.editTextEventStartDate);
在上面一行中,eventStartDate
引用了View
,而不是该视图中的实际字符串数据(在您的情况下为日期)。所以你的数组startDate
中只有一个元素。
String [] startDate = String.valueOf(eventStartDate).split("/");
用下面的
替换所有上述类型的行String[] startDate = eventStartDate.getText().toString().split("/");
现在,您的数组中有3个元素符合预期。
答案 1 :(得分:0)
堆栈跟踪中的这一行:
java.lang.ArrayIndexOutOfBoundsException: length=1; index=2
假设您可以尝试访问索引2中的元素,但该数组只有一个元素(长度= 1)。