-
Notifications
You must be signed in to change notification settings - Fork 2
Upload 일기작성, Diary 일기수정
NaHui999 edited this page Jan 15, 2021
·
4 revisions
- 상단에 선택한 문장이 뜨고, 하단에 일기를 작성할 수 있는 뷰
- 로직
-키보드와 토글
- 화면 넘어간 처음 상태: 키보드가 비생성 상태(Toggle 펼쳐짐)
- EditText 영역 터치: 무조건 키보드 생성
- 키보드 생성 상태: Toggle이 접혀져 문장 내용이 가려진다.
- 키보드 비생성 상태: Toggle이 펼쳐져 문장 내용이 보인다.
- 키보드 생성 여부와 별개로 토글 버튼을 사용해 문장을 접고 펼 수 있다.
[1, 4] [2,3]
[5]
-핸드폰 뒤로가기 버튼이나 화면의 < 버튼을 누르는 경우
EditText에 내용이 없을 때는 이전 Activity로 넘어가고, EditText에 내용이 있다면 내용이 저장되지 않는다는 경고 모달이 발생한다.
-내용이 없는 상태에서 다음을 누르면 토스트 메세지 발생
- Toggle Button 구현
//토글 기능
binding.togglebtn.setOnClickListener {
if(binding.tvSentence.visibility==View.GONE){
binding.togglebtn.rotation=0.0f
binding.tvSentence.setVisible()
}
else{
binding.togglebtn.rotation=180.0f
binding.tvSentence.setGone()
}
}
- EditText 외 구역 터치시 키보드 자동 닫힘 구현
EditText가 터치되면 hint도 자동으로 사라지도록 함.
//EditText터치시
binding.etDiary.setOnClickListener {
binding.togglebtn.rotation=180.0f
binding.tvSentence.setGone()
binding.etDiary.requestFocus()
binding.etDiary.hint=""
}
//EditText외 부분 터치시 키보드 안뜨게. 그 외 부분에 다 터치 인식
binding.constraintlayout.toggle_visible()
binding.cardview.toggle_visible()
private fun View.toggle_visible(){
this.setOnClickListener {
binding.etDiary.unshowKeyboard()
binding.togglebtn.rotation=0.0f
binding.tvSentence.setVisible()
}
}
unshowKeyboard는 확장함수
/*키보드 숨기기*/
fun EditText.showKeyboard() {
if (requestFocus()) {
// edittext에 초점이 맞춰지면 키보드 올라옴
(context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
setSelection(text.length)
}
}
fun EditText.unshowKeyboard() {
if (requestFocus()) {
// edittext에 초점이 맞춰지면 키보드 내려감
(context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
.hideSoftInputFromWindow(this.windowToken, 0)
setSelection(text.length)
}
}
fun View.hideKeyboard() {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, 0)
}
Visibility 확장함수
/* visibility */
fun View.setVisible() {
this.visibility = View.VISIBLE
}
fun View.setInVisible() {
this.visibility = View.INVISIBLE
}
fun View.setGone() {
this.visibility = View.GONE
}
- 경고 모달 메세지 구현
Diary의 수정인 경우 "" 대신에 기존의 Data값을 가져와 비교한다.
private fun checkEditDiary() {
// 일기를 1자라도 수정했을 경우 팝업
// 일기를 수정하지 않은 경우 팝업 없이 finish()
if(binding.etDiary.text.toString() == "") {
finish()
overridePendingTransition(R.anim.horizontal_right_in, R.anim.horizontal_left_out)
} else {
val backModal = ModalUploadWriteBack(this)
backModal.start()
backModal.setOnClickListener {
if(it == "확인") {
finish()
overridePendingTransition(R.anim.horizontal_right_in, R.anim.horizontal_left_out)
}
}
}
}
- Back 버튼에 따른 Action 설정 구현
private val onBackPressListener: BackPressEditText.OnBackPressListener = object :
BackPressEditText.OnBackPressListener {
override fun onBackPress() {
binding.togglebtn.rotation=0.0f
binding.tvSentence.setVisible()
}
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if(event!!.action == KeyEvent.ACTION_DOWN) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
checkEditDiary()
return true
}
}
return super.onKeyDown(keyCode, event)
}
override fun onBackPressed() {
super.onBackPressed()
finish()
overridePendingTransition(R.anim.horizontal_right_in, R.anim.horizontal_left_out)
}
- UploadDeep에서 깊이 임시 저장을 위한 companion
companion object {
var depth=0
var activity : Activity? = null
}