以下是我正在使用的代码片段。我正在为Android做一个应用程序,一切都很好,除了这一个问题,谷歌并没有成为我的朋友。我突出了重要的部分。问题是当TextViews使用updateboxes()方法加载数据时,一切都很好。当他们加载populateFields();方法时间或日期选择器不识别这些值,因为它们直接来自数据库,而不是像使用updateboxes()方法一样使用stringBuilder构建。
字符串不是我的强项,我能想到的唯一的事情是将字符串分解为单个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();
}
}
任何帮助将不胜感激。考虑到其他一切都很好,这个问题让我发疯了。
答案 0 :(得分:1)
好吧长话短说,据我所知,除非你正在使用当前月份,否则getMonth()方法不起作用。奇怪的是getYear()和getDate()方法都可以工作,但是由于我理解的原因,他们重写了getMonth()方法。
这是一个简单的解决方案。
public class GetDateValues { 私人字符串日期; 私人字符破折号;
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);
}
}
现在您有值为varius选择器重新创建字符串。