문제 : 택배 조회를 위해 운송장 번호를 입력해야 한다.
이 때, 휴대폰에서 복사한 운송장 번호를 자동으로 붙여넣기 할 수 있는 기능을 추가해야 한다. (Dialog를 통해 붙여넣기 여부 확인)
해결 :
휴대폰에서 복사한 값에 대한 처리는 클립보드(clipboard)에서 담당한다.
클립보드(clipboard) : '종이 끼우개' 라는 뜻으로, 잘라내기(복사) / 붙여넣기를 통해 문서 또는 응용프로그램 사이에서 자료가 전송 될 때 짧은 시간동안 해당 값을 저장하는 데에 사용되는 소프트웨어 프로그램
우리는 이 클립보드에서 사용자가 복사 (또는 잘라내기) 한 값을 꺼내서 해당 값의 유효성을 확인 한 후, 붙여넣을지 여부를 확인 할 것이다.
Android, Kotlin에서는 클립보드의 값을 꺼내오기 위해 ClipboardManager를 사용한다.
private fun copyClipBoardInvoice() {
//context.getSystemService를 통해 ClipboardManager를 가져온다.
val clipboard = context?.getSystemService(Context.CLIPBOARD_SERVICE)
as ClipboardManager
// clipboard 내부의 값을 가져온다.
val invoice = clipboard.plainTextClip()
// 클립보드 내 값이 유효 && 운송장 번호로 사용할 숫자형태의 문자열인지 && 길이가 20자 이하인지
if (!invoice.isNullOrBlank() && invoice.isDigitsOnly() && invoice.length <= 20) {
AlertDialog.Builder(requireActivity())
.setTitle("클립 보드에 있는 $invoice 를 운송장 번호로 추가하기")
.setPositiveButton("추가") { _, _ ->
binding.invoiceEt.setText(invoice)
}
.setNegativeButton("취소") { _, _ -> }
.create()
.show()
}
}
// 클립보드 내 값의 유효성 검사
private fun ClipboardManager.plainTextClip(): String? =
// 클립보드 내의 값 저장 여부 & 해당 값이 text 형식인지 판단
if (hasPrimaryClip() && (primaryClipDescription?.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN) == true)) {
// 클립보드의 text 값을 toString()을 통해 String 형태로 변환하여 return 한다.
primaryClip?.getItemAt(0)?.text?.toString()
} else {
// 클립보드 내 값이 없거나, text 형식이 아닐 시 null return
null
}
context.getSystemService(Context.CLIPBOARD_SERVICE) 를 통해 object를 가져오고, 이를 ClipboardManager로 타입캐스팅한다.
해당 ClipboardManager의 hasPrimaryClip() 통해 클립보드 내 값이 저장되어 있는지 판단한다. 또한, primaryClipDescription이 MIMETYPE_TEXT_PLAIN인지 확인하여 text 형태인지를 판단한다.
이러한 유효성 검사가 확인되면 클립보드 내 값을 return 하고, 확인되지 않았다면 null을 return 한다.
그 후 클립보드 내 값이 유효한지(nullOrBlank), 운송장 번호로 사용할 숫자형태의 문자열로만 구성되어 있는지(isDigitsOnly),
길이가 20자 이하인지 (length <= 20) 를 판별하여 값을 붙여넣기에 유효한 값인지 확인한다.
결과 :