Skip to content

Commit 85f4848

Browse files
authored
Merge pull request #5 from sephiroth74/hotfix/onTextChanged
don't dispatch user text while typing, updated kotlin version, update…
2 parents 4801546 + a6e9e2f commit 85f4848

File tree

9 files changed

+130
-66
lines changed

9 files changed

+130
-66
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3-
package="it.sephiroth.android.numberpicker.demo">
2+
<manifest
3+
package="it.sephiroth.android.numberpicker.demo"
4+
xmlns:android="http://schemas.android.com/apk/res/android"
5+
xmlns:tools="http://schemas.android.com/tools">
46

57
<application
6-
android:allowBackup="true"
7-
android:icon="@mipmap/ic_launcher"
8-
android:label="@string/app_name"
9-
android:roundIcon="@mipmap/ic_launcher_round"
10-
android:supportsRtl="true"
11-
android:theme="@style/AppTheme">
8+
android:name=".MainApplication"
9+
android:allowBackup="false"
10+
android:icon="@mipmap/ic_launcher"
11+
android:label="@string/app_name"
12+
android:roundIcon="@mipmap/ic_launcher_round"
13+
android:supportsRtl="true"
14+
android:theme="@style/AppTheme"
15+
tools:ignore="GoogleAppIndexingWarning">
1216
<activity android:name=".MainActivity">
1317
<intent-filter>
14-
<action android:name="android.intent.action.MAIN"/>
18+
<action android:name="android.intent.action.MAIN" />
1519

16-
<category android:name="android.intent.category.LAUNCHER"/>
20+
<category android:name="android.intent.category.LAUNCHER" />
1721
</intent-filter>
1822
</activity>
1923
</application>

app/src/main/java/it/sephiroth/android/numberpicker/demo/MainActivity.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package it.sephiroth.android.numberpicker.demo
22

33
import android.os.Bundle
44
import androidx.appcompat.app.AppCompatActivity
5-
import it.sephiroth.android.library.numberpicker.doOnProgressChanged
6-
import it.sephiroth.android.library.numberpicker.doOnStartTrackingTouch
7-
import it.sephiroth.android.library.numberpicker.doOnStopTrackingTouch
5+
import it.sephiroth.android.library.numberpicker.setListener
86
import kotlinx.android.synthetic.main.activity_main.*
97
import timber.log.Timber
108

@@ -14,16 +12,18 @@ class MainActivity : AppCompatActivity() {
1412
super.onCreate(savedInstanceState)
1513
setContentView(R.layout.activity_main)
1614

17-
numberPicker.doOnProgressChanged { numberPicker, progress, formUser ->
18-
// progress changed
19-
}
15+
numberPicker.setListener {
16+
onProgressChanged { numberPicker, progress, fromUser ->
17+
Timber.v("doOnProgressChanged($progress, $fromUser)")
18+
}
2019

21-
numberPicker.doOnStartTrackingTouch { numberPicker ->
22-
// tracking started
23-
}
20+
onStartTrackingTouch {
21+
Timber.v("onStartTrackingTouch")
22+
}
2423

25-
numberPicker.doOnStopTrackingTouch { numberPicker ->
26-
// tracking ended
24+
onStopTrackingTouch {
25+
Timber.v("onStopTrackingTouch")
26+
}
2727
}
2828
}
2929
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package it.sephiroth.android.numberpicker.demo
2+
3+
import android.app.Application
4+
import timber.log.Timber
5+
6+
class MainApplication : Application() {
7+
8+
override fun onCreate() {
9+
Timber.plant(Timber.DebugTree())
10+
super.onCreate()
11+
}
12+
}

app/src/main/res/layout/activity_main.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
style="@style/NumberPicker.Outlined"
3535
android:layout_width="wrap_content"
3636
android:layout_height="wrap_content"
37+
app:picker_editTextStyle="@style/NumberPicker.EditTextStyle.Disabled"
3738
android:layout_marginTop="8dp"
3839
android:progress="50"
3940
app:layout_constraintEnd_toEndOf="@+id/numberPicker"
@@ -45,7 +46,7 @@
4546
android:layout_height="wrap_content"
4647
android:layout_marginEnd="16dp"
4748
android:gravity="right"
48-
android:text="Outlined Vertical Picker"
49+
android:text="Outlined Picker (input disabled)"
4950
app:layout_constraintBottom_toBottomOf="@+id/numberPicker2"
5051
app:layout_constraintEnd_toStartOf="@+id/numberPicker2"
5152
app:layout_constraintTop_toTopOf="@+id/numberPicker2" />

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22

33
buildscript {
4-
ext.kotlin_version = '1.3.20'
4+
ext.kotlin_version = '1.3.21'
55
repositories {
66
google()
77
jcenter()
88

99
}
1010
dependencies {
11-
classpath 'com.android.tools.build:gradle:3.4.0-beta03'
11+
classpath 'com.android.tools.build:gradle:3.4.0-beta05'
1212
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1313
// NOTE: Do not place your application dependencies here; they belong
1414
// in the individual module build.gradle files

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ kotlin.code.style=official
2323
ANDROID_BUILD_SDK_VERSION=28
2424
ANDROID_BUILD_TARGET_SDK_VERSION=28
2525

26-
VERSION_NAME=1.0.1
27-
VERSION_CODE=2
26+
VERSION_NAME=1.0.2
27+
VERSION_CODE=3
2828
GROUP=it.sephiroth.android.library
2929

3030
POM_DESCRIPTION=Sliding Number Picker for Android

numberpicker/src/main/java/it/sephiroth/android/library/numberpicker/NumberPicker.kt

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import android.widget.LinearLayout
1616
import android.widget.TextView
1717
import androidx.appcompat.view.ContextThemeWrapper
1818
import androidx.appcompat.widget.AppCompatImageButton
19-
import androidx.core.widget.doOnTextChanged
2019
import io.reactivex.Observable
2120
import io.reactivex.android.schedulers.AndroidSchedulers
2221
import io.reactivex.disposables.Disposable
@@ -71,6 +70,7 @@ class NumberPicker @JvmOverloads constructor(
7170
private var buttonInterval: Disposable? = null
7271

7372
private val longGestureListener = { it: UIGestureRecognizer ->
73+
Timber.i("longGestureListener = ${it.state}")
7474
when {
7575
it.state == UIGestureRecognizer.State.Began -> {
7676
requestFocus()
@@ -87,7 +87,8 @@ class NumberPicker @JvmOverloads constructor(
8787
}
8888

8989
it.state == UIGestureRecognizer.State.Changed -> {
90-
var diff = if (data.orientation == VERTICAL) it.currentLocationY - it.downLocationY else it.currentLocationX - it.downLocationX
90+
var diff =
91+
if (data.orientation == VERTICAL) it.currentLocationY - it.downLocationY else it.currentLocationX - it.downLocationX
9192
if (diff > tracker.minDistance) {
9293
diff = tracker.minDistance
9394
} else if (diff < -tracker.minDistance) {
@@ -115,6 +116,7 @@ class NumberPicker @JvmOverloads constructor(
115116

116117
@Suppress("MemberVisibilityCanBePrivate")
117118
fun setProgress(value: Int, fromUser: Boolean = true) {
119+
Timber.i("setProgress($value, $fromUser)")
118120
if (value != data.value) {
119121
data.value = value
120122
tooltip?.update(data.value.toString())
@@ -148,6 +150,8 @@ class NumberPicker @JvmOverloads constructor(
148150
data.stepSize = value
149151
}
150152

153+
private var initialized = false
154+
151155
init {
152156
setWillNotDraw(false)
153157
isFocusable = true
@@ -241,7 +245,6 @@ class NumberPicker @JvmOverloads constructor(
241245

242246
@SuppressLint("ClickableViewAccessibility")
243247
private fun initializeButtonActions() {
244-
245248
upButton.setOnTouchListener { _, event ->
246249
if (!isEnabled) {
247250
false
@@ -263,10 +266,10 @@ class NumberPicker @JvmOverloads constructor(
263266
ARROW_BUTTON_FRAME_DELAY,
264267
TimeUnit.MILLISECONDS,
265268
Schedulers.io())
266-
.observeOn(AndroidSchedulers.mainThread())
267-
.subscribe {
268-
setProgress(progress + stepSize)
269-
}
269+
.observeOn(AndroidSchedulers.mainThread())
270+
.subscribe {
271+
setProgress(progress + stepSize)
272+
}
270273
}
271274

272275
MotionEvent.ACTION_UP -> {
@@ -301,10 +304,10 @@ class NumberPicker @JvmOverloads constructor(
301304
ARROW_BUTTON_FRAME_DELAY,
302305
TimeUnit.MILLISECONDS,
303306
Schedulers.io())
304-
.observeOn(AndroidSchedulers.mainThread())
305-
.subscribe {
306-
setProgress(progress - stepSize)
307-
}
307+
.observeOn(AndroidSchedulers.mainThread())
308+
.subscribe {
309+
setProgress(progress - stepSize)
310+
}
308311
}
309312

310313
MotionEvent.ACTION_UP -> {
@@ -321,21 +324,23 @@ class NumberPicker @JvmOverloads constructor(
321324
}
322325
}
323326

324-
editText.doOnTextChanged { text, _, _, _ ->
325-
if (!text.isNullOrEmpty()) {
326-
try {
327-
this.setProgress(Integer.valueOf(text.toString()))
328-
} catch (e: NumberFormatException) {
329-
Timber.e(e)
330-
}
331-
}
332-
}
327+
// editText.doOnTextChanged { text, _, _, _ ->
328+
// if (!text.isNullOrEmpty()) {
329+
// try {
330+
// this.setProgress(Integer.valueOf(text.toString()))
331+
// } catch (e: NumberFormatException) {
332+
// Timber.e(e)
333+
// }
334+
// }
335+
// }
333336

334337
editText.setOnFocusChangeListener { _, hasFocus ->
335338
setBackgroundFocused(hasFocus)
336339

337340
if (!hasFocus) {
338-
if (editText.text.isNullOrEmpty()) {
341+
if (!editText.text.isNullOrEmpty()) {
342+
setProgress(Integer.valueOf(editText.text.toString()), true)
343+
} else {
339344
editText.setText(data.value.toString())
340345
}
341346
}
@@ -383,15 +388,15 @@ class NumberPicker @JvmOverloads constructor(
383388
animate().alpha(0.5f).start()
384389

385390
tooltip = Tooltip.Builder(context)
386-
.anchor(editText, 0, 0, false)
387-
.styleId(tooltipStyleId)
388-
.arrow(true)
389-
.closePolicy(ClosePolicy.TOUCH_NONE)
390-
.overlay(false)
391-
.showDuration(0)
392-
.text(if (minValue.toString().length > maxValue.toString().length) minValue.toString() else maxValue.toString())
393-
.animationStyle(if (orientation == VERTICAL) R.style.NumberPicker_AnimationVertical else R.style.NumberPicker_AnimationHorizontal)
394-
.create()
391+
.anchor(editText, 0, 0, false)
392+
.styleId(tooltipStyleId)
393+
.arrow(true)
394+
.closePolicy(ClosePolicy.TOUCH_NONE)
395+
.overlay(false)
396+
.showDuration(0)
397+
.text(if (minValue.toString().length > maxValue.toString().length) minValue.toString() else maxValue.toString())
398+
.animationStyle(if (orientation == VERTICAL) R.style.NumberPicker_AnimationVertical else R.style.NumberPicker_AnimationHorizontal)
399+
.create()
395400

396401
tooltip?.doOnPrepare { tooltip ->
397402
tooltip.contentView?.let { contentView ->
@@ -430,12 +435,6 @@ class NumberPicker @JvmOverloads constructor(
430435

431436
val FOCUSED_STATE_ARRAY = intArrayOf(android.R.attr.state_focused)
432437
val UNFOCUSED_STATE_ARRAY = intArrayOf(0, -android.R.attr.state_focused)
433-
434-
init {
435-
if (BuildConfig.DEBUG) {
436-
Timber.plant(Timber.DebugTree())
437-
}
438-
}
439438
}
440439
}
441440

numberpicker/src/main/java/it/sephiroth/android/library/numberpicker/NumberPickerExt.kt

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ inline fun NumberPicker.addProgressChangedListener(
2020
numberPicker: NumberPicker,
2121
progress: Int,
2222
formUser: Boolean
23-
) -> Unit = { _, _, _ -> },
23+
) -> Unit = { _, _, _ -> },
2424

2525
crossinline startTrackingTouch: (numberPicker: NumberPicker) -> Unit = { _ -> },
2626

2727
crossinline stopTrackingTouch: (numberPicker: NumberPicker) -> Unit = { _ -> }
2828

29-
): NumberPicker.OnNumberPickerChangeListener {
29+
): NumberPicker.OnNumberPickerChangeListener {
3030
val listener = object : NumberPicker.OnNumberPickerChangeListener {
3131

3232
override fun onProgressChanged(numberPicker: NumberPicker, progress: Int, fromUser: Boolean) {
@@ -44,4 +44,41 @@ inline fun NumberPicker.addProgressChangedListener(
4444
}
4545
numberPickerChangeListener = listener
4646
return listener
47-
}
47+
}
48+
49+
class _OnNumberPickerChangeListener : NumberPicker.OnNumberPickerChangeListener {
50+
51+
override fun onProgressChanged(numberPicker: NumberPicker, progress: Int, fromUser: Boolean) {
52+
_onProgressChanged?.invoke(numberPicker, progress, fromUser)
53+
}
54+
55+
override fun onStartTrackingTouch(numberPicker: NumberPicker) {
56+
_onStartTrackingTouch?.invoke(numberPicker)
57+
}
58+
59+
override fun onStopTrackingTouch(numberPicker: NumberPicker) {
60+
_onStopTrackingTouch?.invoke(numberPicker)
61+
}
62+
63+
fun onProgressChanged(func: (NumberPicker, Int, Boolean) -> Unit) {
64+
_onProgressChanged = func
65+
}
66+
67+
fun onStartTrackingTouch(func: (NumberPicker) -> Unit) {
68+
_onStartTrackingTouch = func
69+
}
70+
71+
fun onStopTrackingTouch(func: (NumberPicker) -> Unit) {
72+
_onStopTrackingTouch = func
73+
}
74+
75+
private var _onProgressChanged: ((NumberPicker, Int, Boolean) -> Unit)? = null
76+
private var _onStartTrackingTouch: ((NumberPicker) -> Unit)? = null
77+
private var _onStopTrackingTouch: ((NumberPicker) -> Unit)? = null
78+
}
79+
80+
inline fun NumberPicker.setListener(func: _OnNumberPickerChangeListener.() -> Unit) {
81+
val listener = _OnNumberPickerChangeListener()
82+
listener.func()
83+
numberPickerChangeListener = listener
84+
}

numberpicker/src/main/res/values/styles.xml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575

7676
<style name="NumberPicker.EditTextStyle" parent="Widget.AppCompat.EditText">
7777
<item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
78-
<item name="android:selectAllOnFocus">false</item>
78+
<item name="android:selectAllOnFocus">true</item>
7979
<item name="android:textIsSelectable">false</item>
8080
<item name="android:inputType">numberSigned</item>
8181
<item name="android:gravity">center</item>
@@ -84,4 +84,15 @@
8484
<item name="android:imeOptions">actionDone</item>
8585
</style>
8686

87+
<style name="NumberPicker.EditTextStyle.Disabled">
88+
<item name="android:selectAllOnFocus">false</item>
89+
<item name="android:textIsSelectable">false</item>
90+
<item name="android:selectable">false</item>
91+
<item name="android:focusable">false</item>
92+
<item name="android:focusableInTouchMode">false</item>
93+
<item name="android:inputType">none</item>
94+
<item name="android:editable">false</item>
95+
<item name="android:clickable">false</item>
96+
</style>
97+
8798
</resources>

0 commit comments

Comments
 (0)