Котлин проверки текста


Я новичок в Kotlinне так ново для Java и Android развития. Но хочет и пытается сделать переключатель. Я написал простой валидатор для EditText и было интересно, если есть способ, чтобы написать его более компактным с лямбдами.

textMTU.addTextChangedListener(object : EditTextValidator(textMTU) {
    override fun validate(textView: EditText, text: String) {
        val textToInt = if (text.isEmpty()) 0  else text.toInt()
        if (textToInt < 1280 || textToInt > 1500) {
            textView.error = getString(R.string.errorTroubleshoot)
        }
        else {
            textView.error = null
            val input = if (textMTU.rawText.isEmpty()) defaultSize else textMTU.rawText.toInt()
            if (input in 1281..1499) {
                prefs.mtuSize = input
            }
        }
    }

EditTextValidator здесь просто продлевается TextWatcher без beforeTextChanged и onTextChanged методы



1072
0
задан 9 апреля 2018 в 11:04 Источник Поделиться
Комментарии
1 ответ

В первую очередь, обратить внимание - код дважды пересчитать и проверить значение. Предполагаю, что это не эффективно. Еще одна маленькая проблема - 1280 и 1500 значения не меняются префов.mtuSize...

Мой код:

class MainActivity : AppCompatActivity() {
val TAG = MainActivity::class.simpleName.toString()

private val defaultSize = 1500
private var prefsMtuSize: Int = defaultSize

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val textMTU = findViewById<EditText>(R.id.textMTU)

// Extension function
textMTU.addTextChangedListener { text ->
val textToInt = try { text.toInt() } catch (e: NumberFormatException) { 0 }
if (textToInt in 1280..1500) { // 1280 <= textToInt <= 1500
textMTU.error = null
prefsMtuSize = textToInt
} else {
textMTU.error = getString(R.string.errorTroubleshoot)
prefsMtuSize = defaultSize
}
Log.i(TAG, "prefsMtuSize = $prefsMtuSize")
}
}
}

private fun EditText.addTextChangedListener(testFunction: (text: String) -> Unit) {
addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
testFunction(s.toString())
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }
})
}

5
ответ дан 15 апреля 2018 в 04:04 Источник Поделиться