회원 유형 선택 UI

애플리케이션 내에서 약사 사용자와 청소년 사용자의 기능이 다르기 때문에 구분하여 회원가입할 수 있도록 한다.
회원 유형 선택 구현
CertifyActivity.kt
val userTypeShared : SharedPreferences = getSharedPreferences("userType", Context.MODE_PRIVATE)!!
val userType = userTypeShared.getString("userType", null).toString()
userType이라는 이름을 가진 SharedPreferences 객체를 획득하고, SharedPreferences 객체의 생성과 데이터 저장을 위해서 Editor 객체 획득
SharedPreferences는 데이터를 간단하게 키-값(key-value) 성격으로 저장
SharedPreferences의 첫 번째 인자는 해당 SharedPreferences의 이름이다. 특정 이름으로 생성할 수 있고 해당 이름으로 xml 파일이 생성된다.
user_pharmacist_iv.setOnClickListener {
val intent = Intent(this, CertifyActivity::class.java)
editor.putString("userType","1")
editor.apply()
startActivity(intent)
}
버튼 클릭에 따라서 key-value를 저장
<전체 코드>
class UserActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_user)
val userTypeShared = getSharedPreferences("userType", MODE_PRIVATE)
val editor = userTypeShared.edit()
user_pharmacist_iv.setOnClickListener {
val intent = Intent(this, CertifyActivity::class.java)
editor.putString("userType","1")
editor.apply()
startActivity(intent)
}
user_girl_iv.setOnClickListener {
val intent = Intent(this, CertifyActivity::class.java)
editor.putString("userType","2")
editor.apply()
startActivity(intent)
}
}
}
본인 인증 UI

해당 애플리케이션은 여성 청소년을 위한 앱이기 때문에 여성 인증을 수행한다. 주민등록번호 13자리를 입력하여 여성임을 인증한다.
처음에는 아임포트(Iamport)를 통해서 본인인증을 받으려고 했지만 가맹점 식별 코드가 필요했기 때문에 추후에 보완하는 것으로 두고 주민등록번호 인증을 통한 본인인증을 구현하였다.
본인 인증 기능 구현
val userTypeShared : SharedPreferences = getSharedPreferences("userType", Context.MODE_PRIVATE)!!
val userType = userTypeShared.getString("userType", null).toString()
SharedPreferences객체의 getString()을 통해 key인 userType의 value를 받아온다.
getString()의 첫 번째 인자는 원하는 값의 key이며, 두 번째 인자는 디폴트 값이다.
// 주민등록번호가 유효한 여성인지 확인하는 함수
private fun isValidFemaleRegistrationID(id: String, userType: String): Boolean {
var reg: Regex? = null
// 여성인지 확인
if(id.length != 13)
return false
reg = if(userType == "1") { // 약사인 경우
Regex("^[1-9]\\d(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[2][0-9]{6}$")
}else{ // 청소년인 경우
Regex("^[0]\\d(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[4][0-9]{6}$")
}
if(!id.matches(reg))
return false
// 유효한 주민번호인지 확인
var tempSum= 0
for (i in 0 until id.length - 1) {
tempSum += id[i].toString().toInt() * ((i % 8) + 2)
}
return 11 - (tempSum % 11) == id[id.length - 1].toString().toInt()
}
Regex 객체를 통해 정규표현식을 만들어서 주민등록번호 뒷자리가 2, 4로 시작하는지(여성인지) 확인
주민등록번호 유효성 검사 공식에 따라서 유효한 주민등록번호인지 확인
<전체 코드>
class CertifyActivity : AppCompatActivity() {
companion object{
lateinit var userTypeShared : SharedPreferences
}
override fun onCreate(savedInstanceState: Bundle?) {
userTypeShared = getSharedPreferences("userType", Context.MODE_PRIVATE)!!
val userType = userTypeShared.getString("userType", null).toString()
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_certify)
certify_idNum_front_et.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {
//텍스트를 입력 후
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
//텍스트 입력 전
certify_fail_tv.text = null
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
//텍스트 입력 중
}
})
certify_idNum_back_et.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {
//텍스트를 입력 후
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
//텍스트 입력 전
certify_fail_tv.text = null
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
//텍스트 입력 중
}
})
certify_btn.setOnClickListener {
val id = certify_idNum_front_et.text.toString()+certify_idNum_back_et.text.toString()
if(isValidFemaleRegistrationID(id, userType)){
Toast.makeText(this, "본인인증완료",Toast.LENGTH_LONG).show()
val intent = Intent(this, SignupActivity::class.java)
startActivity(intent)
}
else{
certify_fail_tv.text = "본인인증에 실패하셨습니다."
}
}
}
private fun isValidFemaleRegistrationID(id: String, userType: String): Boolean { // 주민등록번호가 유효한 여성인지 확인하는 함수
var reg: Regex? = null
if(id.length != 13)
return false
reg = if(userType == "1") {
Regex("^[1-9]\\d(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[2][0-9]{6}$")
}else{
Regex("^[0]\\d(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[4][0-9]{6}$")
}
if(!id.matches(reg))
return false
var tempSum= 0
for (i in 0 until id.length - 1) {
tempSum += id[i].toString().toInt() * ((i % 8) + 2)
}
return 11 - (tempSum % 11) == id[id.length - 1].toString().toInt()
}
}
(addTextChangedListener와 TextWatcher 인터페이스 관련 내용은 이전 글 참고)
더보기
[Reference]