Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  1. import android.text.Editable
  2. import android.text.TextWatcher
  3. import android.widget.EditText
  4. import io.reactivex.Observable
  5.  
  6. /**
  7. * TextWatcherの使いづらさを少しでも軽減するためのExtension集
  8. * 目的は以下の2点の不満を解消すること
  9. * 1. 必ず3つのコールバックメソッドを実装しなくてはならない(多くの場合使用するメソッドは1つであることが多いので少し面倒)
  10. * 2. 入力された文字列がコールバックされるのに引数の型がStringではない。毎度Stringに変換するのは少し手間
  11. */
  12.  
  13. /**
  14. * 入力された文字列を必ずStringで流すよう型を定義
  15. */
  16. interface TextChangedType {
  17. val s: String
  18. }
  19.  
  20. /**
  21. * EditTextにセットするTextWatcherの3つのコールバックメソッドに対応するクラスを定義
  22. * After → afterTextChanged(editable: Editable?)
  23. * Before → beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int)
  24. * On → onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int)
  25. */
  26. sealed class TextChanged : TextChangedType {
  27. class After(override val s: String) : TextChanged()
  28. class Before(override val s: String, val start: Int, val count: Int, val after: Int) : TextChanged()
  29. class On(override val s: String, val start: Int, val before: Int, val count: Int) : TextChanged()
  30. }
  31.  
  32. /**
  33. * EditTextクラスの拡張
  34. * 入力された文字列のみを流すObservable<String>を返す
  35. * 使用するコールバックメソッドは引数の型で分岐させる
  36. * @param clazz [TextChangedType]
  37. * @return
  38. *
  39. * <使用例>
  40. * binding.ediText
  41. * .toStringObservable(TextChanged.After::class.java)
  42. * .subscribe {
  43. * //ここで文字列を受け取る
  44. * }
  45. */
  46. inline fun <reified T> EditText.toStringObservable(clazz: Class<T>): Observable<String> where T : TextChangedType {
  47. return toObservable(clazz).map { it.s }
  48. }
  49.  
  50. /**
  51. * EditTextクラスの拡張
  52. * TextWatcherのコールバックメソッドで受け取った引数の値を流すObservable<T>を返す
  53. * 使用するコールバックメソッドは引数の型で分岐させる
  54. * @param clazz [TextChangedType]
  55. * @return
  56. *
  57. * <使用例>
  58. * binding.ediText
  59. * .toObservable(TextChanged.After::class.java)
  60. * .subscribe {
  61. * //ここでTextWatcherの該当するコールバックメソッドの引数の値を全て含んだデータを受け取る
  62. * }
  63. */
  64. inline fun <reified T> EditText.toObservable(clazz: Class<T>): Observable<T> where T : TextChangedType {
  65. return Observable.create { emitter ->
  66. when (clazz) {
  67. TextChanged.After::class.java ->
  68. this@toObservable.afterTextChangedListener {
  69. emitter.onNext(TextChanged.After(it) as T)
  70. }
  71. TextChanged.Before::class.java ->
  72. this@toObservable.beforeTextChangedListener { s, start, count, after ->
  73. emitter.onNext(TextChanged.Before(s, start, count, after) as T)
  74. }
  75. TextChanged.On::class.java ->
  76. this@toObservable.onTextChangedListener { s, start, before, count ->
  77. emitter.onNext(TextChanged.On(s, start, before, count) as T)
  78. }
  79. }
  80. }
  81. }
  82.  
  83. /**
  84. * EditTextクラスの拡張
  85. * TextWatcherのafterTextChangedListenerの値だけをcallBackに流す
  86. * @param callBack
  87. */
  88. fun EditText.afterTextChangedListener(callBack: (String) -> Unit) {
  89. this@afterTextChangedListener.addTextChangedListener(object : TextWatcher {
  90. override fun afterTextChanged(editable: Editable?) {
  91. editable?.let {
  92. callBack.invoke("$it")
  93. }
  94. }
  95.  
  96. override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
  97. override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
  98. })
  99. }
  100.  
  101. /**
  102. * EditTextクラスの拡張
  103. * TextWatcherのbeforeTextChangedの値だけをcallBackに流す
  104. * @param callBack
  105. */
  106. fun EditText.beforeTextChangedListener(callBack: (s: String, start: Int, count: Int, after: Int) -> Unit) {
  107. this@beforeTextChangedListener.addTextChangedListener(object : TextWatcher {
  108. override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
  109. s?.let {
  110. callBack.invoke("$it", start, count, after)
  111. }
  112. }
  113.  
  114. override fun afterTextChanged(editable: Editable?) {}
  115. override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
  116. })
  117. }
  118.  
  119. /**
  120. * EditTextクラスの拡張
  121. * TextWatcherのonTextChangedの値だけをcallBackに流す
  122. * @param callBack
  123. */
  124. fun EditText.onTextChangedListener(callBack: (s: String, start: Int, before: Int, count: Int) -> Unit) {
  125. this@onTextChangedListener.addTextChangedListener(object : TextWatcher {
  126. override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
  127. s?.let {
  128. callBack.invoke("$it", start, before, count)
  129. }
  130. }
  131.  
  132. override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
  133. override fun afterTextChanged(editable: Editable?) {}
  134. })
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement