<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="16dp" />
<stroke
android:width="1dp"
android:color="@color/primary_color" />
</shape>
radius는 글자 크기의 절반보다 크게해서 양옆이 동그랗게 보이도록 설정해준다.
Chip에는 다음과 같이 4종류의 padding이 존재한다.
chipStartPadding을 0dp로 설정한 경우이다.
따라서, EditText도 paddingStart와 paddingEnd값을 chipStartPadding이랑 chipEndPadding과 동일하게 맞춰 줄 것이다.
Filter Chip의 경우 선택했을 때 앞에 icon이 생기는데 이때의 icon padding 값이다.
EditText의 경우 icon이 없는 것도 있지만 설정된 값도 0dp이니 변경하지 않도록 한다.
아까 chipStartPadding을 0dp로 설정한 것에서 textStartPadding을 0dp으로 설정한 경우이다. 완전히 border에 딱 붙은 것을 확인할 수 있다.
EditText의 경우 text, chip padding을 따로 설정하지 않고 더해서 padding값을 주도록 하였다.
완성본에도 나와있지만 input chip은 뒤에 close icon이 같이 생성된다.
나의 경우에는 EditText에 실제 close icon을 붙이지 않고 입력이 안료되면 입력된 text를 가지는 chip을 addView하는 방식으로 구현하였다.
minHeight는 말 그대로 해당 뷰의 최소 뷰 높이를 설정하는 것이다. 만약 0dp 로 설정한다면
다음과 같이 text에 딱 맞춰 작아진 것을 볼 수 있다.
근데 여기서 minHeight를 0으로 줄였어도 뷰의 마진?은 그대로 있는 것을 알 수 있는데 이게 바로 chipMinTouchTargetSize 때문이다.
chipMinTouchTargetSize는 chip이 터치될 수 있는 최소사이즈를 말한다. ensureMinTouchTargetSize가 true일 때 설정이 된다. 만약 이를 false로 변경하면
다음과 같이 마진이 없어지고 뷰 사이즈와 stroke된 사이즈가 동일해진 것을 볼 수 있다.
이렇게 해서 나온 최종 결과물은
다음과 같이 높이가 똑같아졌다!!
<style name="Widget.App.EditText.IngredientAdd" parent="Widget.AppCompat.EditText">
<item name="android:background">@drawable/background_edit_chip</item>
<item name="android:textColor">@color/primary_color</item>
<item name="android:paddingStart">12dp</item>
<item name="android:layout_marginEnd">4dp</item>
<item name="android:layout_marginTop">4dp</item>
<item name="android:layout_marginBottom">4dp</item>
<item name="android:paddingEnd">12dp</item>
<item name="android:minHeight">32dp</item>
<item name="maxLine">1</item>
<item name="android:inputType">text</item>
<item name="android:imeOptions">actionDone</item>
<item name="android:textAppearance">@style/TextAppearance.App.Regular14</item>
</style>
addIngredientEditText.setOnFocusChangeListener { v, hasFocus ->
if (hasFocus.not()) {
val oldText = viewModel.getIngredientInputText()
if (oldText.isNotEmpty()) {
ingredientGroup.addIngredient(oldText)
addIngredientEditText.text?.clear()
}
addIngredientEditText.isVisible = false
}
}
addIngredientButton.setOnClickListener {
addIngredientEditText.clearFocus()
addIngredientEditText.isVisible = true
}
추가하기 버튼 클릭 리스터는 다음과 같이 구현했다.
훌륭한 글 감사드립니다.