时间/日期选择器无法识别字符串
问题描述:
这是我正在处理的一段代码。我正在为android制作应用程序,除了这一个问题以外,一切都很顺利,谷歌也不是我的朋友。我强调了重要的部分。问题是当TextViews使用updateboxes()方法加载数据时,一切都很好。当他们加载了populateFields();方法时间或日期选择器不会识别这些值,因为它们直接来自数据库,并且不像string updateBuilder那样使用updateboxes()方法构建。时间/日期选择器无法识别字符串
字符串不是我的强项,我唯一能想到的就是将字符串分解成单独的mDay mMonth mYear值,然后通过updateBoxes()方法运行它们,但我认为会有更简单的方法。无论如何,我不知道该怎么做。
下面是代码:
package com.example.TimeClockAppreset;
import java.util.Calendar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.AdapterView.OnItemSelectedListener;
public class TimesEdit extends Activity{
private TimesDbAdapter mDbHelper;
private Long mRowId;
private TextView mDateBox;
private TextView mTimeBox;
private int mYear;
private int mMonth;
private int mDay;
private int mHour;
private int mMinute;
static final int TIME_DIALOG_ID = 0;
static final int DATE_DIALOG_ID = 1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDbHelper = new TimesDbAdapter(this);
mDbHelper.open();
setContentView(R.layout.entry_edit);
mDateBox = (TextView) findViewById(R.id.DateBox);
mTimeBox = (TextView) findViewById(R.id.TimeBox);
Button changeTime = (Button) findViewById(R.id.changeTime);
Button changeDate = (Button) findViewById(R.id.changeDate);
Button confirmButton = (Button) findViewById(R.id.confirm);
Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.ClockBox_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
mRowId = (savedInstanceState == null) ? null :
(Long) savedInstanceState.getSerializable(TimesDbAdapter.KEY_ROWID);
if (mRowId == null) {
Bundle extras = getIntent().getExtras();
mRowId = extras != null ? extras.getLong(TimesDbAdapter.KEY_ROWID)
: null;
}
//updateBoxes();
populateFields();
changeTime.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(TIME_DIALOG_ID);
}
});
changeDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(DATE_DIALOG_ID);
}
});
confirmButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
setResult(RESULT_OK);
finish();
}
});
}
//THIS GETS THE INFO AND POPULATES THE FIELDS
private void populateFields() {
if (mRowId != null) {
Cursor time = mDbHelper.fetchTime(mRowId);
startManagingCursor(time);
mDateBox.setText(time.getString(
time.getColumnIndexOrThrow(TimesDbAdapter.KEY_DATE)));
mTimeBox.setText(time.getString(
time.getColumnIndexOrThrow(TimesDbAdapter.KEY_TIME)));
}
else
updateBoxes();
}
private void updateBoxes() {
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
updateDateDisplay();
updateTimeDisplay();
}
private void updateDateDisplay() {
mDateBox.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(mMonth + 1).append("-")
.append(mDay).append("-")
.append(mYear).append(" "));
}
private void updateTimeDisplay() {
mTimeBox.setText(
new StringBuilder()
.append(pad(mHour)).append(":")
.append(pad(mMinute)));
}
private static String pad(int c) {
if (c >= 10)
return String.valueOf(c);
else
return "0" + String.valueOf(c);
}
public class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
}
@SuppressWarnings("unchecked")
public void onNothingSelected(AdapterView parent) {
// Do nothing.
}
}
private TimePickerDialog.OnTimeSetListener mTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
updateTimeDisplay();
}
};
private DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateDateDisplay();
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay);
case TIME_DIALOG_ID:
return new TimePickerDialog(this, mTimeSetListener, mHour, mMinute, false);
}
return null;
}
private void saveState() {
String date = mDateBox.getText().toString();
String time = mTimeBox.getText().toString();
String inOut = "NA";
if (mRowId == null) {
long id = mDbHelper.createEntry(time, date, inOut);
if (id > 0) {
mRowId = id;
}
} else {
mDbHelper.updateTimeTest(mRowId, time, date);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveState();
outState.putSerializable(TimesDbAdapter.KEY_ROWID, mRowId);
}
@Override
protected void onPause() {
super.onPause();
saveState();
}
@Override
protected void onResume() {
super.onResume();
populateFields();
}
}
任何帮助,将不胜感激。考虑到其他一切都很好,这个问题让我疯狂。
答
很好,长话短说,至于我可以告诉getMonth()方法不工作,除非你正在使用当前月份。它奇怪的getYear()和getDate()方法都可以工作,但他们已经改写了getMonth()方法,这是因为我理解的原因。
这是简单的解决方案。
public class GetDateValues { private String date; private char dash;
public GetDateValues(String str, char sep) {
date = str;
dash = sep;
}
public String month() {
int dot = date.indexOf(dash);
return date.substring(0,dot);
}
public String day() {
int dot = date.lastIndexOf(dash);
int sep = date.indexOf(dash);
return date.substring(sep + 1, dot);
}
public String year() {
int sep = date.lastIndexOf(dash);
return date.substring(sep + 1, sep + 5);
}
}
现在你要重拍的杂色山雀采摘的字符串值。