summaryrefslogtreecommitdiff
path: root/src/com
diff options
context:
space:
mode:
authorJames Kung <kingkung@google.com>2013-04-18 14:48:15 -0700
committerJames Kung <kingkung@google.com>2013-04-18 18:21:00 -0700
commit71492ab60892087f3e989b876b82f5c0249b3b14 (patch)
tree738de5f95129ed5542cebf570c4f6f37ed434a1c /src/com
parente4efb8a14871c227368bc79fd043e761fc2b2f1f (diff)
downloaddatetimepicker-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.java6
-rw-r--r--src/com/android/datetimepicker/date/YearPickerView.java45
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());
}
}