1

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

}

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

4

1 回答 1

1

好吧,长话短说,据我所知 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);
}

}

现在您有了重新制作各种选择器的字符串的值。

于 2010-06-29T03:08:52.247 回答