From 415a3a8202cb3d50f94fd92b6d96055674ba60ae Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Wed, 4 Mar 2015 16:53:24 +0200 Subject: [PATCH] selectedIndex logic fixed --- ui/segmented-bar/segmented-bar-common.ts | 8 +++- ui/segmented-bar/segmented-bar.android.ts | 55 ++++++++++++++++------- ui/segmented-bar/segmented-bar.ios.ts | 8 +++- 3 files changed, 53 insertions(+), 18 deletions(-) diff --git a/ui/segmented-bar/segmented-bar-common.ts b/ui/segmented-bar/segmented-bar-common.ts index 75829594d..9eedd4c3f 100644 --- a/ui/segmented-bar/segmented-bar-common.ts +++ b/ui/segmented-bar/segmented-bar-common.ts @@ -10,7 +10,13 @@ export module knownCollections { export class SegmentedBar extends view.View implements definition.SegmentedBar { public _addArrayFromBuilder(name: string, value: Array) { if (name === "items") { - this.items = value; + this._setValue(SegmentedBar.itemsProperty, value); + } + } + + public _adjustSelectedIndex() { + if (this.selectedIndex > this.items.length - 1) { + this._setValue(SegmentedBar.selectedIndexProperty, this.items.length - 1); } } diff --git a/ui/segmented-bar/segmented-bar.android.ts b/ui/segmented-bar/segmented-bar.android.ts index 004d813ff..2303023db 100644 --- a/ui/segmented-bar/segmented-bar.android.ts +++ b/ui/segmented-bar/segmented-bar.android.ts @@ -9,11 +9,12 @@ require("utils/module-merge").merge(common, exports); function onSelectedIndexPropertyChanged(data: dependencyObservable.PropertyChangeData) { var view = data.object; - if (!view.android) { + if (!view.android || !view.items) { return; } var index = data.newValue; + if (types.isNumber(index) && index >= 0 && index <= view.items.length - 1) { view.android.setCurrentTab(index); } @@ -28,41 +29,63 @@ function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) { view.android.clearAllTabs(); - for (var i = 0; i < view.items.length; i++) { - var title = view.items[i].title; - var tab = view.android.newTabSpec(i + ""); + var newItems = >data.newValue; - tab.setIndicator(title); + if (newItems && newItems.length) { + for (var i = 0; i < newItems.length; i++) { + var title = newItems[i].title; + var tab = view.android.newTabSpec(i + ""); - tab.setContent(new android.widget.TabHost.TabContentFactory({ - createTabContent: function (tag: string): android.view.View { - var tv = new android.widget.TextView(view._context); - tv.setVisibility(android.view.View.GONE); - return tv; - } - })); + tab.setIndicator(title); - view.android.addTab(tab); + tab.setContent(new android.widget.TabHost.TabContentFactory({ + createTabContent: function (tag: string): android.view.View { + var tv = new android.widget.TextView(view._context); + tv.setVisibility(android.view.View.GONE); + return tv; + } + })); + + view.android.addTab(tab); + } + + view._adjustSelectedIndex(); + + if (view.android.getCurrentTab() !== view.selectedIndex) { + view.android.setCurrentTab(view.selectedIndex); + } + + view.android.setOnTabChangedListener(null); + view.android.setOnTabChangedListener(view._listener); } } (common.SegmentedBar.itemsProperty.metadata).onSetNativeValue = onItemsPropertyChanged; export class SegmentedBar extends common.SegmentedBar { private _android: OurTabHost; + public _listener: android.widget.TabHost.OnTabChangeListener; public _createUI() { this._android = new OurTabHost(this._context, null); + if (this._android.getCurrentTab() !== this.selectedIndex) { + this._android.setCurrentTab(this.selectedIndex); + } var that = new WeakRef(this); - this._android.setOnTabChangedListener(new android.widget.TabHost.OnTabChangeListener({ + this._listener = new android.widget.TabHost.OnTabChangeListener({ onTabChanged: function (id: string) { var bar = that.get(); if (bar) { - bar.selectedIndex = parseInt(id); + var oldIndex = bar.selectedIndex; + var newIndex = parseInt(id); + + if (oldIndex !== newIndex) { + bar._onPropertyChangedFromNative(SegmentedBar.selectedIndexProperty, newIndex); + } } } - })); + }); var tabHostLayout = new android.widget.LinearLayout(this._context); tabHostLayout.setOrientation(android.widget.LinearLayout.VERTICAL); diff --git a/ui/segmented-bar/segmented-bar.ios.ts b/ui/segmented-bar/segmented-bar.ios.ts index 3832b3f01..f108fcc46 100644 --- a/ui/segmented-bar/segmented-bar.ios.ts +++ b/ui/segmented-bar/segmented-bar.ios.ts @@ -9,7 +9,7 @@ require("utils/module-merge").merge(common, exports); function onSelectedIndexPropertyChanged(data: dependencyObservable.PropertyChangeData) { var view = data.object; - if (!view.ios) { + if (!view.ios || !view.items) { return; } @@ -31,6 +31,12 @@ function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) { for (var i = 0; i < view.items.length; i++) { view.ios.insertSegmentWithTitleAtIndexAnimated(view.items[i].title, i, false); } + + view._adjustSelectedIndex(); + + if (view.ios.selectedSegmentIndex !== view.selectedIndex) { + view.ios.selectedSegmentIndex = view.selectedIndex; + } } (common.SegmentedBar.itemsProperty.metadata).onSetNativeValue = onItemsPropertyChanged;