NumberFormat 을 이용하면 숫자에 단위 콤마를 쉽게 찍을수 있다.
하지만 이를 EditText에 적용할려고 하면 한가지 문제가 생긴다.
입력할때마다 콤마가 찍혀야 하는데...
addTextChangedListener에서 NumberFormat으로 콤마를 찍으면 당연히 텍스트가 변경되므로 다시 리스너가 호출된다. 즉, 호출이 무한 반복되면서 앱이 멈추게 된다.
그래서 살짝 꼼수를 부려봤다.
EditText 밑에 같은 크기의 TextView를 깔고 여기에 콤마를 찍은 텍스트를 대신 써주고,
후에 EditText를 동기화 하는 것이다. 물론, EditText는 투명하게 설정해 안보이게 한다.
사실 임시 방편으로 만든것인데.. 생각보다 잘 작동해 계속 쓰고 있다 ㅎㅎㅎ
소스는 다음과 같다. 요즘 뜨고 있다는 코틀린으로 작성했다~
class NumberEditText: RelativeLayout {
private var editText: EditText
private var textView: TextView
init {
editText = EditText(context)
textView = TextView(context)
initBase()
}
constructor(context: Context): super(context) {
editText = EditText(context)
textView = TextView(context)
initBase()
}
private fun initBase() {
layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
//EditText가 안보이도록 투명 처리한다
editText.setTextColor(Color.TRANSPARENT)
editText.setBackgroundColor(Color.TRANSPARENT)
editText.gravity = gravity
textView.gravity = gravity
//TextView 위에 EditText를 생성한다
addView(textView, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT))
addView(editText, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT))
editText.setOnTouchListener { view, motionEvent ->
//EditText를 터치하면 TextView의 내용을 동기화 한다
if (motionEvent.action == MotionEvent.ACTION_UP) {
//내용을 쓸때 입력 커서 위치가 변경되지 않도록 조정한다
val length = textView!!.text.length - (view as EditText).text.length
val selectionStart = view.selectionStart + length
val selectionEnd = view.selectionEnd + length
//내용을 쓰고 커서 위치를 조정한 후 적용되도록 포커스를 요청한다
view.setText(textView?.text)
view.setSelection(selectionStart, selectionEnd)
view.requestFocus()
}
false
}
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) {
//콤마를 찍어 TextView에 쓴다
textView.text = getNumberText(s.toString())
}
})
}
private fun getNumberText(text: String): String {
return if (text.length > 1) NumberFormat.getNumberInstance().format(text.replace(",", "").toDouble()) else text
}
}
도움이 되셨다면~ 정성으로 빚은 저희 앱! 많은 이용 바래요:)
https://meorimal.com/index.html?tab=spaceship
https://meorimal.com/subway.html
'개발 > android' 카테고리의 다른 글
객체 속도가 빠를수록 충돌검사가 부정확해진다면 (0) | 2019.04.02 |
---|---|
Dialog를 닫았는데 background로 나갔다 들어오니 다시 열린다??? (0) | 2019.03.13 |
sqlite의 time이 자정을 인식 못할 경우, 간단한 꼼수 해결법 (0) | 2018.09.27 |
Intent 전달 방식을 모방하여 부모 activity를 호출하기 (0) | 2018.06.07 |
ListView에 EditText를 넣을때 반드시 살펴봐야 할점 (0) | 2017.09.11 |