Enable recycling of nativeView 2 (#4467)

* enable recycling of nativeView

* backgroundInternal is reset if setting new value leads to background.isEmpty() == true.

* android background.getDefault always return copy of the background. Now all controls that mutate the background can be reset to initial state (e.g. Button & ActionBar)
passing resources to copied background so it respect density.
fix properties initNativeView

* reset padding when backgroundInternal is reset.

* Fix text reset
Fix padding reset

* fix tsc errors

* fix ugly text rendering.

* Add unit tests for recycling native views
Fix several issues that came from the above tests
Fix maxLength property missing a converter callback
Remove old files

* Remove old files

* Revert backgroundInternal setter

* change the order of tests so that appium can work again

* Remove suggestion on every TextView & TextField init (strangely it is enabled after view is recycled....)

* Fix function to get parent layout if specified

* Button stateListAnimator restored when button is recycled
zIndex defaultValue is now undefined instead of NaN

* revert zIndex.setNative to always clear stateListAnimator because it was breaking one UI test (setting value=0 was returning the previous stateListAnimator)

* fix search-bar backgound-color recycling

* Fix alignments setters

* Fix imageView recycling
Fix button recycling
Fix edit-text recycling
resetNativeView is called only if recycleNativeView flag is true

* Fix incorrect merge

* Fix text-view & text-field textTransform

* Fix EditText text reset

* Fix runtime crash on ARM emulator API 21

* Fix text-base minHeight. maxHeight reset
Fix reset of isUserInteractionEnabled
This commit is contained in:
Alexander Vakrilov
2017-06-29 18:01:22 +03:00
committed by GitHub
parent b1432679e6
commit 23757e5dfc
97 changed files with 1405 additions and 578 deletions

View File

@@ -14,6 +14,7 @@ interface ClickListener {
let ClickListener: ClickListener;
let APILEVEL: number;
let AndroidButton: typeof android.widget.Button;
function initializeClickListener(): void {
if (ClickListener) {
@@ -34,17 +35,19 @@ function initializeClickListener(): void {
ClickListener = ClickListenerImpl;
APILEVEL = android.os.Build.VERSION.SDK_INT;
AndroidButton = android.widget.Button;
}
export class Button extends ButtonBase {
nativeView: android.widget.Button;
private _stateListAnimator: any;
private _highlightedHandler: (args: TouchGestureEventData) => void;
@profile
public createNativeView() {
initializeClickListener();
const button = new android.widget.Button(this._context);
const button = new AndroidButton(this._context);
const clickListener = new ClickListener(this);
button.setOnClickListener(clickListener);
(<any>button).clickListener = clickListener;
@@ -52,7 +55,8 @@ export class Button extends ButtonBase {
}
public initNativeView(): void {
(<any>this.nativeView).clickListener.owner = this;
const nativeView = this.nativeView;
(<any>nativeView).clickListener.owner = this;
super.initNativeView();
}
@@ -61,6 +65,15 @@ export class Button extends ButtonBase {
super.disposeNativeView();
}
public resetNativeView(): void {
super.resetNativeView();
if (this._stateListAnimator && APILEVEL >= 21) {
(<any>this.nativeView).setStateListAnimator(this._stateListAnimator);
this._stateListAnimator = undefined;
}
}
@PseudoClassHandler("normal", "highlighted", "pressed", "active")
_updateHandler(subscribe: boolean) {
if (subscribe) {
@@ -108,15 +121,17 @@ export class Button extends ButtonBase {
org.nativescript.widgets.ViewHelper.setPaddingLeft(this.nativeView, Length.toDevicePixels(value, 0) + Length.toDevicePixels(this.style.borderLeftWidth, 0));
}
[zIndexProperty.getDefault](): number {
return org.nativescript.widgets.ViewHelper.getZIndex(this.nativeView);
}
[zIndexProperty.setNative](value: number) {
org.nativescript.widgets.ViewHelper.setZIndex(this.nativeView, value);
// API >= 21
if (APILEVEL >= 21) {
(<any>this.nativeView).setStateListAnimator(null);
const nativeView = this.nativeView;
if (!this._stateListAnimator) {
this._stateListAnimator = (<any>nativeView).getStateListAnimator();
}
(<any>nativeView).setStateListAnimator(null);
}
org.nativescript.widgets.ViewHelper.setZIndex(this.nativeView, value);
}
[textAlignmentProperty.setNative](value: TextAlignment) {