a-3-2-1(2).TextViewのレイアウトとイベント登録
目標設定
課題
- EditTextの複数行のテキストをXMLから指定することができるか。
- EditTextを制約配置(ConstraintLayout)で指定することができるか。
- EditTextを列配置(LinearLayout)で指定することができるか。
- EditTextのキー編集前のイベントを登録できるか。また、編集キャンセルできるか。
Github
テスト実装
EditTextTestActivity.kt
package com.example.androidtest
import android.os.Bundle
import android.text.Editable
import android.text.InputFilter
import android.text.TextWatcher
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.example.androidtest.databinding.ActivityEditTextTestBinding
class EditTextTestActivity : AppCompatActivity() {
lateinit var binding: ActivityEditTextTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityEditTextTestBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
binding.editText2EditTextView.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
if (s.toString().length > 8) {
Log.d("EditTextTestActivity", "文字制限をオーバーしました")
} else {
Log.d("EditTextTestActivity", "文字制限ないです")
}
}
})
// 4. EditTextのキー編集前のイベントを登録できるか。また、編集キャンセルできるか。
// ・可能でした。
val regexChars = "0-9abc"
binding.editText2EditTextView.filters = arrayOf(
InputFilter { source, _, _, _, _, _ ->
if (source.matches(Regex("[$regexChars]+"))) {
source
} else {
source.replace(Regex("[^$regexChars]+"), "")
}
})
}
}
activity_edit_text_test.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<!--
1. EditTextの複数行のテキストをXMLから指定することができるか。
・可能でした。
2. EditTextを制約配置(ConstraintLayout)で指定することができるか。
・可能でした。
-->
<EditText
android:id="@+id/edit_text_1_edit_text_view"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginStart="23dp"
android:layout_marginEnd="23dp"
android:layout_marginTop="23dp"
android:padding="8dp"
android:inputType="textMultiLine"
android:text="あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ"
android:textSize="13sp"
android:gravity="top|start"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@drawable/style2_edit_text_background"
tools:ignore="HardcodedText,LabelFor"
android:autofillHints=""
tools:targetApi="o" />
<!--
3. EditTextを列配置(LinearLayout)で指定することができるか。
・可能でした。
-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginStart="23dp"
android:layout_marginTop="23dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/edit_text_1_edit_text_view"
>
<EditText
android:id="@+id/edit_text_2_edit_text_view"
android:layout_width="300dp"
android:layout_height="48dp"
android:autofillHints=""
android:background="@drawable/style2_edit_text_background"
android:gravity="center|start"
android:inputType="textShortMessage"
android:maxLength="15"
android:padding="8dp"
android:text=""
android:textSize="13sp"
tools:ignore="HardcodedText,LabelFor,SpeakableTextPresentCheck"
tools:targetApi="o" />
<Space
android:layout_width="match_parent"
android:layout_height="8dp" />
<EditText
android:id="@+id/edit_text_3_edit_text_view"
android:layout_width="300dp"
android:layout_height="48dp"
android:autofillHints=""
android:background="@drawable/style2_edit_text_background"
android:gravity="center|start"
android:inputType="textShortMessage"
android:maxLength="15"
android:padding="8dp"
android:text=""
android:textSize="13sp"
tools:ignore="HardcodedText,LabelFor,SpeakableTextPresentCheck"
tools:targetApi="o" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
style2_edit_text_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#c1c1c1" />
<stroke android:width="4dp" android:color="#7d7d7d" />
<corners android:bottomLeftRadius="8dp"
android:bottomRightRadius="8dp"
android:topLeftRadius="8dp"
android:topRightRadius="8dp"/>
</shape>
</item>
</selector>