EditTextをKotlinで作ってみます。例として文字を入力、ボタンをタップすることにより TextView に表示させてみます。
2024.1.1
EditText
EditTextは文字の入力を扱います。
とりあえず基本的なところを理解しておきましょう。
JavaでのEditTextはこちらを参照してください。
EditTextの設定
activity_main/xml レイアウトファイルにEditTextの設定を記述します。
id を edit_text として作成すると、
1 2 3 4 |
<EditText android:id="@+id/edit_text" ... /> |
EditTextから入力された文字を取り出すために
1 |
editText.text.toString() |
を使います
文字が入力されたことを確認してEditTextからButton を使って文字列を取り出すトリガーにします。
基本的には、このようにして使うことが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import com.example.kotlinedittext.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.button.setOnClickListener { // エディットテキストのテキストを取得 if(binding.editText.text != null){ // 取得したテキストを TextView に張り付ける binding.textView.text = binding.editText.text.toString() } } } } |
サンプルコード
まとめてみます。
MainActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//package com.example.kotlinedittext import android.os.Bundle import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import com.example.kotlinedittext.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } binding.button.setOnClickListener { // エディットテキストのテキストを取得 if(binding.editText.text != null){ // 取得したテキストを TextView に張り付ける binding.textView.text = binding.editText.text.toString() } } } } |
build.gradle
1 2 3 4 5 6 7 8 |
... android { ... buildFeatures { viewBinding = true } } ... |
inputType, hint
android:hint
android:autofillHints
android:inputType
を設定しないとwarningが出ます。
android:hint
ここに文字入力をしてくださいなどわかるように半透明の文字を出します。
入力し始めるとそれはなくなります。
1 |
android:hint="@string/hint" |
android:autofillHints
これは以前に入力したものを再度使いたい場合など、ログインのID名などを表示してミスタイプを防ぐためのものです。
ただここを設定しただけではできないので、AutofillServiceなどの実装が必要です。ここでは扱わないので適当にwarningを消す目的だけの設定になっています。
1 |
android:autofillHints="@string/hint" |
android:inputType
以前はこれがなくてもwariningも出なかったのですが、想定されるものが数字か文字なのかなどによりキーボードの種類が変わります。
1 |
android:inputType="text" |
その他多数あります
- text
- textUri
- number
- phone
- daterime
- etc.
入力方法のタイプの指定InputType | Android Developers
TextViewの文字サイズを大きくして背景色を明るいグレーで設定します。
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/text_view" android:textSize="30sp" android:text="@string/app_name" android:background="#abbb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.35" /> <EditText android:id="@+id/edit_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hint" android:inputType="text" android:hint="@string/hint" android:autofillHints="@string/hint" android:background="#abbb" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.5"/> <Button android:id="@+id/button" android:text="@string/button" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.65" /> </androidx.constraintlayout.widget.ConstraintLayout> |
hintをリソースに追加します。
strings.xml
1 2 3 4 5 |
<resources> <string name="app_name">KotlinEditText</string> <string name="button">Button</string> <string name="hint">input</string> </resources> |
れで完成です。
この方法は、昔のボタンしかなかった時のアプリでは有効ですが実際には困ることがあります。スマホの画面タッチはいつでも、どこでもできるので文字入力だけして、他のアイコンをタップしたり、Homeに戻ったりと文字を入力しても、確定してくれないユーザーもいるからです。スマホではそれができてしまいます
そんなケースにはリアルタイムに文字入力を監視するTextWatcher などを使います。
Reference:
EidtText | Android Developers
入力方法のタイプの指定
InputType | Android Developers