Fix: editable not working when keyboardType is set

This commit is contained in:
vakrilov
2016-04-14 11:56:35 +03:00
parent 92771d4183
commit af30ddfc0c

View File

@ -8,6 +8,7 @@ import types = require("utils/types");
export class EditableTextBase extends common.EditableTextBase { export class EditableTextBase extends common.EditableTextBase {
private _android: android.widget.EditText; private _android: android.widget.EditText;
private _textWatcher: android.text.TextWatcher; private _textWatcher: android.text.TextWatcher;
private _keyListenerCache: android.text.method.IKeyListener;
/* tslint:disable */ /* tslint:disable */
private _dirtyTextAccumulator: string; private _dirtyTextAccumulator: string;
/* tslint:enable */ /* tslint:enable */
@ -23,15 +24,15 @@ export class EditableTextBase extends common.EditableTextBase {
public _createUI() { public _createUI() {
this._android = new android.widget.EditText(this._context); this._android = new android.widget.EditText(this._context);
this._configureEditText(); this._configureEditText();
this.android.setTag(this.android.getKeyListener()); this._keyListenerCache = this.android.getKeyListener();
var that = new WeakRef(this); var that = new WeakRef(this);
this._textWatcher = new android.text.TextWatcher({ this._textWatcher = new android.text.TextWatcher({
beforeTextChanged: function(text: string, start: number, count: number, after: number) { beforeTextChanged: function (text: string, start: number, count: number, after: number) {
// //
}, },
onTextChanged: function(text: string, start: number, before: number, count: number) { onTextChanged: function (text: string, start: number, before: number, count: number) {
var owner = that.get(); var owner = that.get();
if (!owner) { if (!owner) {
return; return;
@ -42,7 +43,7 @@ export class EditableTextBase extends common.EditableTextBase {
owner.android.addTextChangedListener(owner._textWatcher); owner.android.addTextChangedListener(owner._textWatcher);
owner.android.setSelection(selectionStart); owner.android.setSelection(selectionStart);
}, },
afterTextChanged: function(editable: android.text.IEditable) { afterTextChanged: function (editable: android.text.IEditable) {
var owner = that.get(); var owner = that.get();
if (!owner) { if (!owner) {
return; return;
@ -63,7 +64,7 @@ export class EditableTextBase extends common.EditableTextBase {
this._android.addTextChangedListener(this._textWatcher); this._android.addTextChangedListener(this._textWatcher);
var focusChangeListener = new android.view.View.OnFocusChangeListener({ var focusChangeListener = new android.view.View.OnFocusChangeListener({
onFocusChange: function(view: android.view.View, hasFocus: boolean) { onFocusChange: function (view: android.view.View, hasFocus: boolean) {
var owner = that.get(); var owner = that.get();
if (!owner) { if (!owner) {
return; return;
@ -82,7 +83,7 @@ export class EditableTextBase extends common.EditableTextBase {
this._android.setOnFocusChangeListener(focusChangeListener); this._android.setOnFocusChangeListener(focusChangeListener);
var editorActionListener = new android.widget.TextView.OnEditorActionListener({ var editorActionListener = new android.widget.TextView.OnEditorActionListener({
onEditorAction: function(textView: android.widget.TextView, actionId: number, event: android.view.KeyEvent): boolean { onEditorAction: function (textView: android.widget.TextView, actionId: number, event: android.view.KeyEvent): boolean {
var owner = that.get(); var owner = that.get();
if (owner) { if (owner) {
if (actionId === android.view.inputmethod.EditorInfo.IME_ACTION_DONE || if (actionId === android.view.inputmethod.EditorInfo.IME_ACTION_DONE ||
@ -164,7 +165,7 @@ export class EditableTextBase extends common.EditableTextBase {
break; break;
} }
this._android.setInputType(newInputType); this._setInputType(newInputType);
} }
public _onReturnKeyTypePropertyChanged(data: dependencyObservable.PropertyChangeData) { public _onReturnKeyTypePropertyChanged(data: dependencyObservable.PropertyChangeData) {
@ -203,7 +204,7 @@ export class EditableTextBase extends common.EditableTextBase {
} }
if (data.newValue) { if (data.newValue) {
this.android.setKeyListener(<android.text.method.IKeyListener>this.android.getTag()); this.android.setKeyListener(this._keyListenerCache);
} }
else { else {
this.android.setKeyListener(null); this.android.setKeyListener(null);
@ -237,7 +238,7 @@ export class EditableTextBase extends common.EditableTextBase {
break; break;
} }
editableTextBase.android.setInputType(inputType); editableTextBase._setInputType(inputType);
} }
public _onAutocorrectPropertyChanged(data: dependencyObservable.PropertyChangeData) { public _onAutocorrectPropertyChanged(data: dependencyObservable.PropertyChangeData) {
@ -263,7 +264,7 @@ export class EditableTextBase extends common.EditableTextBase {
break; break;
} }
editableTextBase.android.setInputType(inputType); editableTextBase._setInputType(inputType);
} }
public _onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { public _onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) {
@ -274,4 +275,19 @@ export class EditableTextBase extends common.EditableTextBase {
editableTextBase.android.setHint(data.newValue + ""); editableTextBase.android.setHint(data.newValue + "");
} }
private _setInputType(inputType): void {
this.android.setInputType(inputType);
// setInputType will change the keyListener so we should cache it again
let listener = this.android.getKeyListener();
if (listener) {
this._keyListenerCache = listener;
}
// clear the listener if editable is false
if (!this.editable) {
this.android.setKeyListener(null);
}
}
} }