diff options
author | James Kung <kingkung@google.com> | 2013-04-18 14:48:15 -0700 |
---|---|---|
committer | James Kung <kingkung@google.com> | 2013-04-18 18:21:00 -0700 |
commit | 71492ab60892087f3e989b876b82f5c0249b3b14 (patch) | |
tree | 738de5f95129ed5542cebf570c4f6f37ed434a1c /src/com | |
parent | e4efb8a14871c227368bc79fd043e761fc2b2f1f (diff) | |
download | datetimepicker-71492ab60892087f3e989b876b82f5c0249b3b14.tar.gz |
Fix null pointer exception in year picker
Retain year picker position offset on orientation change
Bug: 8658299
Bug: 8581974
Change-Id: Ib21c5235be29f9143788b22fbd25d62538203265
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/datetimepicker/date/DatePickerDialog.java | 6 | ||||
-rw-r--r-- | src/com/android/datetimepicker/date/YearPickerView.java | 45 |
2 files changed, 30 insertions, 21 deletions
diff --git a/src/com/android/datetimepicker/date/DatePickerDialog.java b/src/com/android/datetimepicker/date/DatePickerDialog.java index 77bedbf..8954c35 100644 --- a/src/com/android/datetimepicker/date/DatePickerDialog.java +++ b/src/com/android/datetimepicker/date/DatePickerDialog.java @@ -67,6 +67,7 @@ public class DatePickerDialog extends DialogFragment implements private static final String KEY_YEAR_START = "year_start"; private static final String KEY_YEAR_END = "year_end"; private static final String KEY_CURRENT_VIEW = "current_view"; + private static final String KEY_LIST_POSITION_OFFSET = "list_position_offset"; private static final int DEFAULT_START_YEAR = 1900; private static final int DEFAULT_END_YEAR = 2100; @@ -181,6 +182,7 @@ public class DatePickerDialog extends DialogFragment implements listPosition = mDayPickerView.getMostVisiblePosition(); } else if (mCurrentView == YEAR_VIEW) { listPosition = mYearPickerView.getFirstVisiblePosition(); + outState.putInt(KEY_LIST_POSITION_OFFSET, mYearPickerView.getFirstPositionOffset()); } outState.putInt(KEY_LIST_POSITION, listPosition); } @@ -202,6 +204,7 @@ public class DatePickerDialog extends DialogFragment implements mYearView.setOnClickListener(this); int listPosition = -1; + int listPositionOffset = 0; int currentView = MONTH_AND_DAY_VIEW; if (savedInstanceState != null) { mWeekStart = savedInstanceState.getInt(KEY_WEEK_START); @@ -209,6 +212,7 @@ public class DatePickerDialog extends DialogFragment implements mMaxYear = savedInstanceState.getInt(KEY_YEAR_END); currentView = savedInstanceState.getInt(KEY_CURRENT_VIEW); listPosition = savedInstanceState.getInt(KEY_LIST_POSITION); + listPositionOffset = savedInstanceState.getInt(KEY_LIST_POSITION_OFFSET); } final Activity activity = getActivity(); @@ -248,7 +252,7 @@ public class DatePickerDialog extends DialogFragment implements if (currentView == MONTH_AND_DAY_VIEW) { mDayPickerView.postSetSelection(listPosition); } else if (currentView == YEAR_VIEW) { - mYearPickerView.postSetSelection(listPosition); + mYearPickerView.postSetSelectionFromTop(listPosition, listPositionOffset); } } return view; diff --git a/src/com/android/datetimepicker/date/YearPickerView.java b/src/com/android/datetimepicker/date/YearPickerView.java index 465b759..411c574 100644 --- a/src/com/android/datetimepicker/date/YearPickerView.java +++ b/src/com/android/datetimepicker/date/YearPickerView.java @@ -79,15 +79,19 @@ public class YearPickerView extends ListView implements OnItemClickListener, OnD public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mController.tryVibrate(); TextViewWithCircularIndicator clickedView = (TextViewWithCircularIndicator) view; - if (mSelectedView != clickedView) { - mSelectedView.drawIndicator(false); - mSelectedView.requestLayout(); - clickedView.drawIndicator(true); - clickedView.requestLayout(); - mSelectedView = clickedView; + if (clickedView != null) { + if (clickedView != mSelectedView) { + if (mSelectedView != null) { + mSelectedView.drawIndicator(false); + mSelectedView.requestLayout(); + } + clickedView.drawIndicator(true); + clickedView.requestLayout(); + mSelectedView = clickedView; + } + mController.onYearSelected(getYearFromTextView(clickedView)); + mAdapter.notifyDataSetChanged(); } - mController.onYearSelected(getYearFromTextView(clickedView)); - mAdapter.notifyDataSetChanged(); } private int getYearFromTextView(TextView view) { @@ -115,31 +119,32 @@ public class YearPickerView extends ListView implements OnItemClickListener, OnD } } - public void postSetSelection(final int position) { - post(new Runnable() { - - @Override - public void run() { - setSelection(position); - requestLayout(); - } - }); + public void postSetSelectionCentered(final int position) { + postSetSelectionFromTop(position, mViewSize / 2 - mChildSize / 2); } - public void postSetSelectionFromTop(final int position) { + public void postSetSelectionFromTop(final int position, final int offset) { post(new Runnable() { @Override public void run() { - setSelectionFromTop(position, mViewSize / 2 - mChildSize / 2); + setSelectionFromTop(position, offset); requestLayout(); } }); } + public int getFirstPositionOffset() { + final View firstChild = getChildAt(0); + if (firstChild == null) { + return 0; + } + return firstChild.getTop(); + } + @Override public void onDateChanged() { mAdapter.notifyDataSetChanged(); - postSetSelectionFromTop(mController.getSelectedDay().year - mController.getMinYear()); + postSetSelectionCentered(mController.getSelectedDay().year - mController.getMinYear()); } } |