Выбор времени / даты не распознает строки - PullRequest
1 голос
/ 24 июня 2010

Вот фрагмент кода, с которым я работаю.Я делаю приложение для Android, и все идет отлично, кроме этой одной проблемы, и Google не был моим другом в этом.Я выделил важные части.Проблема в том, что когда TextView загружаются с данными с помощью метода updateboxes (), все работает отлично.Когда они загружены с populateFields ();Метод, средство выбора времени или даты не распознает значения, так как они приходят прямо из базы данных и не построены с помощью stringBuilder, как метод 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();
            }

}

Любая помощь будет признательна.Эта проблема сводит меня с ума, учитывая, что все остальное хорошо.

1 Ответ

1 голос
/ 29 июня 2010

Хорошо, коротко говоря, насколько я могу судить, метод getMonth () не работает, если вы не работаете с текущим месяцем. Его странные методы getYear () и getDate () работают, но они переписали метод getMonth () по причинам, которые мне недоступны.

Вот простое решение.

открытый класс 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);
}

}

Теперь у вас есть значения, чтобы переделать строки для сборщиков переменных.

...