summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/TextView.java45
1 files changed, 28 insertions, 17 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 5e4a51420c9d..68958630bd39 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8562,8 +8562,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private class InsertionPointCursorController implements CursorController {
private static final int DELAY_BEFORE_FADE_OUT = 4100;
- // The cursor controller image
- private final HandleView mHandle;
+ // The cursor controller image. Lazily created.
+ private HandleView mHandle;
private final Runnable mHider = new Runnable() {
public void run() {
@@ -8571,23 +8571,21 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
};
- InsertionPointCursorController() {
- mHandle = new HandleView(this, HandleView.CENTER);
- }
-
public void show() {
updatePosition();
- mHandle.show();
+ getHandle().show();
hideDelayed(DELAY_BEFORE_FADE_OUT);
}
void showWithPaste() {
show();
- mHandle.showPastePopupWindow();
+ getHandle().showPastePopupWindow();
}
public void hide() {
- mHandle.hide();
+ if (mHandle != null) {
+ mHandle.hide();
+ }
TextView.this.removeCallbacks(mHider);
}
@@ -8597,7 +8595,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
public boolean isShowing() {
- return mHandle.isShowing();
+ return mHandle != null && mHandle.isShowing();
}
public void updatePosition(HandleView handle, int x, int y) {
@@ -8621,7 +8619,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return;
}
- mHandle.positionAtCursor(offset, true);
+ // updatePosition is called only when isShowing. Handle has been created at this point.
+ getHandle().positionAtCursor(offset, true);
}
public boolean onTouchEvent(MotionEvent ev) {
@@ -8633,10 +8632,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
hide();
}
}
+
+ private HandleView getHandle() {
+ if (mHandle == null) {
+ mHandle = new HandleView(this, HandleView.CENTER);
+ }
+ return mHandle;
+ }
}
private class SelectionModifierCursorController implements CursorController {
- // The cursor controller images
+ // The cursor controller images, lazily created when shown.
private HandleView mStartHandle, mEndHandle;
// The offsets of that last touch down event. Remembered to start selection there.
private int mMinTouchOffset, mMaxTouchOffset;
@@ -8657,8 +8663,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
};
SelectionModifierCursorController() {
- mStartHandle = new HandleView(this, HandleView.LEFT);
- mEndHandle = new HandleView(this, HandleView.RIGHT);
resetTouchOffsets();
}
@@ -8667,17 +8671,23 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return;
}
+ // Lazy object creation has to be done before updatePosition() is called.
+ if (mStartHandle == null) mStartHandle = new HandleView(this, HandleView.LEFT);
+ if (mEndHandle == null) mEndHandle = new HandleView(this, HandleView.RIGHT);
+
mIsShowing = true;
updatePosition();
+
mStartHandle.show();
mEndHandle.show();
+
hideInsertionPointCursorController();
hideDelayed(DELAY_BEFORE_FADE_OUT);
}
public void hide() {
- mStartHandle.hide();
- mEndHandle.hide();
+ if (mStartHandle != null) mStartHandle.hide();
+ if (mEndHandle != null) mEndHandle.hide();
mIsShowing = false;
removeCallbacks(mHider);
}
@@ -8744,6 +8754,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return;
}
+ // The handles have been created since the controller isShowing().
mStartHandle.positionAtCursor(selectionStart, true);
mEndHandle.positionAtCursor(selectionEnd, true);
hideDelayed(DELAY_BEFORE_FADE_OUT);
@@ -8831,7 +8842,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @return true iff this controller is currently used to move the selection start.
*/
public boolean isSelectionStartDragged() {
- return mStartHandle.isDragging();
+ return mStartHandle != null && mStartHandle.isDragging();
}
public void onTouchModeChanged(boolean isInTouchMode) {