Skip to content

Upload 일기작성, Diary 일기수정

NaHui999 edited this page Jan 15, 2021 · 4 revisions

Upload 일기작성, Diary 일기수정

  • 상단에 선택한 문장이 뜨고, 하단에 일기를 작성할 수 있는 뷰
  • 로직

-키보드와 토글

  1. 화면 넘어간 처음 상태: 키보드가 비생성 상태(Toggle 펼쳐짐)
  2. EditText 영역 터치: 무조건 키보드 생성
  3. 키보드 생성 상태: Toggle이 접혀져 문장 내용이 가려진다.
  4. 키보드 비생성 상태: Toggle이 펼쳐져 문장 내용이 보인다.
  5. 키보드 생성 여부와 별개로 토글 버튼을 사용해 문장을 접고 펼 수 있다.

[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
}