@@ -10,7 +10,8 @@ import { ad } from "../../utils/utils";
1010export * from "./editable-text-base-common" ;
1111
1212//https://github.com/NativeScript/NativeScript/issues/2942
13- let dismissKeyboardTimeoutId : any ;
13+ export let dismissKeyboardTimeoutId : NodeJS . Timer ;
14+ export let dismissKeyboardOwner : WeakRef < EditableTextBase > ;
1415
1516interface EditTextListeners extends android . text . TextWatcher , android . view . View . OnFocusChangeListener , android . widget . TextView . OnEditorActionListener {
1617}
@@ -22,6 +23,30 @@ interface EditTextListenersClass {
2223
2324let EditTextListeners : EditTextListenersClass ;
2425
26+ function clearDismissTimer ( ) : void {
27+ dismissKeyboardOwner = null ;
28+ if ( dismissKeyboardTimeoutId ) {
29+ clearTimeout ( dismissKeyboardTimeoutId ) ;
30+ dismissKeyboardTimeoutId = null ;
31+ }
32+ }
33+
34+ function dismissSoftInput ( owner : EditableTextBase ) : void {
35+ clearDismissTimer ( ) ;
36+ if ( ! dismissKeyboardTimeoutId ) {
37+ dismissKeyboardTimeoutId = setTimeout ( ( ) => {
38+ const owner = dismissKeyboardOwner && dismissKeyboardOwner . get ( ) ;
39+ const activity = ( owner && owner . _context ) as android . app . Activity ;
40+ const nativeView = owner && owner . nativeViewProtected ;
41+ dismissKeyboardTimeoutId = null ;
42+ dismissKeyboardOwner = null ;
43+ const focused = activity && activity . getCurrentFocus ( ) ;
44+ if ( ! focused || ! ( focused instanceof android . widget . EditText ) ) {
45+ ad . dismissSoftInput ( nativeView ) ;
46+ }
47+ } , 10 ) ;
48+ }
49+ }
2550function initializeEditTextListeners ( ) : void {
2651 if ( EditTextListeners ) {
2752 return ;
@@ -71,7 +96,7 @@ function initializeEditTextListeners(): void {
7196 }
7297
7398 if ( hasFocus ) {
74- owner . clearDismissTimer ( ) ;
99+ clearDismissTimer ( ) ;
75100 owner . notify ( { eventName : EditableTextBase . focusEvent , object : owner } ) ;
76101 } else {
77102 if ( owner . _dirtyTextAccumulator || owner . _dirtyTextAccumulator === "" ) {
@@ -80,7 +105,7 @@ function initializeEditTextListeners(): void {
80105 }
81106
82107 owner . notify ( { eventName : EditableTextBase . blurEvent , object : owner } ) ;
83- owner . dismissSoftInput ( ) ;
108+ dismissSoftInput ( owner ) ;
84109 }
85110 }
86111
@@ -129,7 +154,6 @@ export abstract class EditableTextBase extends EditableTextBaseCommon {
129154 private _inputType : number ;
130155
131156 public _changeFromCode : boolean ;
132- public _dismissId : NodeJS . Timer ;
133157
134158 public abstract _configureEditText ( editText : android . widget . EditText ) : void ;
135159
@@ -168,35 +192,26 @@ export abstract class EditableTextBase extends EditableTextBaseCommon {
168192 this . nativeViewProtected . setInputType ( this . _inputType ) ;
169193 }
170194
195+ public onUnloaded ( ) {
196+ this . dismissSoftInput ( ) ;
197+ super . onUnloaded ( ) ;
198+ }
199+
171200 public dismissSoftInput ( ) {
172201 const nativeView = this . nativeViewProtected ;
173202 if ( ! nativeView ) {
174203 return ;
175204 }
176205
177- const activity = this . _context as android . app . Activity ;
178- if ( ! this . _dismissId ) {
179- this . _dismissId = setTimeout ( ( ) => {
180- this . _dismissId = null ;
181- const focused = activity . getCurrentFocus ( ) ;
182- if ( ! focused
183- || focused === nativeView
184- || ! ( focused instanceof android . widget . EditText ) ) {
185- ad . dismissSoftInput ( nativeView ) ;
186- }
187- } , 100 ) ;
188- }
206+ ad . dismissSoftInput ( nativeView ) ;
189207 }
190208
191- public clearDismissTimer ( ) : void {
192- if ( this . _dismissId ) {
193- clearTimeout ( this . _dismissId ) ;
194- this . _dismissId = null ;
209+ public focus ( ) : boolean {
210+ const nativeView = this . nativeViewProtected ;
211+ if ( ! nativeView ) {
212+ return ;
195213 }
196- }
197214
198- public focus ( ) : boolean {
199- this . clearDismissTimer ( ) ;
200215 const result = super . focus ( ) ;
201216 if ( result ) {
202217 ad . showSoftInput ( this . nativeViewProtected ) ;
0 commit comments