Android EditText

时间:2020-02-23 14:28:54  来源:igfitidea点击:

在本教程中,我们将在Android应用程序中实现EditText。
我们将使用XML以及以编程方式创建EditText。

Android EditText

Android EditText是TextView的子类,允许用户输入和编辑。
通常在登录屏幕和表单中使用。

EditText XML定义

通过以下方式在XML中定义EditText。

<EditText
      android:id="@+id/inNumber"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_margin="8dp"
      android:hint="@string/enter_a_number_here"
      android:imeOptions="actionNext"
      android:inputType="number" 

EditText属性

  • android:id用于在EditText上设置唯一标识符

  • layout_margin用于在EditText视图外设置页边距。

  • "提示"用于设置EditText的提示。

  • " imeOptions"用于设置最右下方的键盘按钮的行为。
    可以将其设置为完成,搜索,下一个等。
    将其设置为下一个会将光标移至屏幕中存在的下一个EditText。

  • inputType用于指定允许的输入格式。
    默认情况下是文本。
    可以根据我们的需要设置电子邮件,数字,numberDecimal等。

以编程方式创建EditText

我们必须创建EditText对象,然后将其添加到屏幕布局中。

val editText = EditText(this)
linearLayout.addView(editText)

EditText TextWatcher

TextWatcher是一个界面,用于在键入输入之前,之后和期间监听EditText中的更改。

它包含三个需要重写的功能。

  • afterTextChanged:键入内容后立即触发

  • beforeTextChanged:在下一个输入之前被触发。

  • onTextChanged:它在输入期间被触发。

为了在EditText上设置TextWatcher,我们在一个addTextChangedListener函数中调用该接口。

editText.addTextChangedListener(object : TextWatcher {
  override fun afterTextChanged(s: Editable?) {
}

override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}

override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
              toast(message = "Number is $s")
}

})

Kotlin对象与Java对象不同。

onTextChanged()函数在参数方面与afterTextChanged()不同。

我们的示例应用程序将侦听EditText输入中的更改,并在以编程方式定义的TextView中对其进行更新。

Android EditText示例项目结构

1.布局代码

下面给出了activity_main.xml布局的代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/linearLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

  <EditText
      android:id="@+id/inNumber"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_margin="8dp"
      android:hint="@string/enter_a_number_here"
      android:imeOptions="actionNext"
      android:inputType="number" 

</LinearLayout>

2.活动代码

MainActivity.kt类的代码如下:

package net.androidly.androidlyedittext

import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.content.ContextCompat
import android.text.Editable
import android.text.TextWatcher
import android.view.inputmethod.EditorInfo
import android.widget.*
import kotlinx.android.synthetic.main.activity_main.*
import android.widget.LinearLayout

class MainActivity : AppCompatActivity() {

  val txtAfter by lazy { TextView(this) }
  val txtOn by lazy { TextView(this) }
  val txtBefore by lazy { TextView(this) }

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

      val inNumber = findViewById<edittext>(R.id.inNumber)

      inNumber.addTextChangedListener(object : TextWatcher {
          override fun afterTextChanged(s: Editable?) {
          }

          override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

          }

          override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
              toast(message = "Number is $s")
          }

      })

      val editText = EditText(this)
      editText.apply {
          setText("Androidly EditText")
          hint = "Keep entering"
          val lp = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
          lp.setMargins(8, 8, 8, 8)
          layoutParams = lp
          imeOptions = EditorInfo.IME_ACTION_NEXT
          setTextColor(ContextCompat.getColor(this@MainActivity, android.R.color.holo_purple))
          smartTextWatcher(
                  on = { txtOn.apply { text = "onTextChanged: $it" } },
                  after = { txtAfter.apply { text = "smartTextWatcher: $it" } },
                  before = { txtBefore.apply { text = "beforeTextChanged: $it" } }
          )
      }

      linearLayout.addView(editText)

      val editText2 = EditText(this)
      editText2.apply {
          hint = "Enter something"
          val lp = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
          lp.setMargins(8, 8, 8, 8)
          layoutParams = lp
          setBackgroundColor(ContextCompat.getColor(this@MainActivity, android.R.color.holo_green_dark))
          imeOptions = EditorInfo.IME_ACTION_DONE
          smartTextWatcher(
                  on = { txtOn.apply { text = "onTextChanged: $it" } },
                  after = { txtAfter.apply { text = "smartTextWatcher: $it" } },
                  before = { txtBefore.apply { text = "beforeTextChanged: $it" } }
          )
      }

      linearLayout.addView(editText2)

      txtAfter.text = "AfterTextChanged :"
      txtAfter.setPadding(8, 8, 8, 8)
      linearLayout.addView(txtAfter)

      txtOn.text = "OnTextChanged :"
      txtOn.setPadding(8, 8, 8, 8)
      linearLayout.addView(txtOn)

      txtBefore.text = "BeforeTextChanged :"
      txtBefore.setPadding(8, 8, 8, 8)
      linearLayout.addView(txtBefore)
  }

  fun Context.toast(context: Context = applicationContext, message: String, duration: Int = Toast.LENGTH_SHORT) {
      Toast.makeText(context, message, duration).show()
  }

  fun EditText.smartTextWatcher(on: (String) -> Unit, after: (String) -> Unit, before: (String) -> Unit) {
      this.addTextChangedListener(object : TextWatcher {
          override fun afterTextChanged(s: Editable?) {
              after.invoke(s.toString())
          }

          override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
              before.invoke(s.toString())
          }

          override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
              on.invoke(s.toString())
          }
      })
  }
}
</edittext>

在上面的代码中,我们使用" by lazy"以编程方式和惰性方式创建了TextViews。

这意味着TextView实例仅在类中被调用时才会创建。

findViewById <EditText>用于从XML获取EditText。

当EditText中的文本更改时,我们将显示祝酒词。
Toast功能是Kotlin中的扩展功能。

" apply" lambda表达式用于设置EditText上的属性,而无需每次都调用实例。

要以编程方式设置布局参数,我们需要执行以下操作:

val lp = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
lp.setMargins(8, 8, 8, 8)
layoutParams = lp

funEditText.smartTextWatcher是一个扩展函数,用于通过使用lambda表达式来缩短TextWatcher接口的详细代码。

对于每个参数,我们都会更新lambda表达式内的相应文本视图。