时间/日期选择器无法识别字符串

时间:2010-06-24 04:12:22

标签: android datepicker timepicker

以下是我正在使用的代码片段。我正在为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();
            }

}

任何帮助将不胜感激。考虑到其他一切都很好,这个问题让我发疯了。

1 个答案:

答案 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选择器重新创建字符串。