이번 시간에는 ToDo List 만들기 세 번째 시간 메인 화면과 메인 코드를 만들어 보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.09.15 - [안드로이드] - [안드로이드 코틀린] SQLite ToDo List 만드는 방법 part2 - 할 일 화면과 어댑터 클래스
[안드로이드 코틀린] SQLite ToDo List 만드는 방법 part2 - 할 일 화면과 어댑터 클래스
이번 시간에는 ToDo List 만들기 두 번째 시간 할 일 화면과 어댑터 클래스를 만들어 보겠습니다. 목차 1. 할 일 화면 task_item.xml 2. 어댑터 클래스 ToDoAdapter.kt 1. 할 일 화면 task_item.xml..
aries574.tistory.com
- 설명 -
1. 입력하는 레이아웃 LinearLayout
2. 리스트 레이아웃 LinearLayout
3. 등록 및 수정하는 FloatingActionButton
4. 입력 모드일 땐 FloatingActionButton 숨기기
5. 리스트 모드일 땐 입력 레이아웃 숨기기
6. 아이콘 res -> drawable
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- 입력창-->
<LinearLayout
android:id="@+id/bottom_section"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:padding="10dp"
android:visibility="gone">
<EditText
android:id="@+id/todo_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_weight="1" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/add_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="ADD" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/bottom_section"
android:background="#eee">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="16dp"
android:layout_marginBottom="20dp"
android:backgroundTint="@android:color/holo_green_dark"
app:srcCompat="@drawable/ic_add"
app:tint="@android:color/white" />
</RelativeLayout>
- 설명 -
1. selectData() 조회
1-1 taskList = db.getAllTasks()
DB조회 및 리스트에 담기
1-2 Collections.reverse(taskList)
최신순으로 정렬
1-3 adapter.setTasks(taskList)
어댑터에 담기
1-4 adapter.notifyDataSetChanged()
적용
2. selectReset(type: String)
2-1 todoText.setText("")
입력 텍스트 초기화
2-2 if(!type.equals("ADD"))
수정 모드일 때 다시 등록으로 초기화
3. viewMode(type: String)
Type에 따라 입력창을 보여줄지 버튼을 보여줄지 설정
4. hideKeyboard(editText: EditText)
키보드 자동 숨김
5. ItemTouchHelper
스와이프 기능(왼쪽: 삭제, 오른쪽: 수정)
class MainActivity : AppCompatActivity() {
lateinit var taskList: ArrayList<ToDoModel>
lateinit var adapter: ToDoAdapter
lateinit var recyclerView: RecyclerView
lateinit var fab: FloatingActionButton
lateinit var todoText: EditText
lateinit var addBtn: Button
lateinit var db: ToDoDB
lateinit var bottomLayout: LinearLayout
var gId: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//DB
db = ToDoDB(this)
//초기화
taskList = ArrayList()
bottomLayout = findViewById(R.id.bottom_section)
todoText = findViewById(R.id.todo_text)
addBtn = findViewById(R.id.add_btn)
fab = findViewById(R.id.fab)
//recyclerView 설정
recyclerView = findViewById(R.id.recycler_view)
recyclerView.layoutManager = LinearLayoutManager(this)
//adapter 설정
adapter = ToDoAdapter(db)
adapter.setTask(taskList)
//adapter 적용
recyclerView.adapter = adapter
//조회
selectData()
//등록모드
fab.setOnClickListener {
viewMode("ADD")
}
//추가 버튼
addBtn.setOnClickListener {
viewMode("FAB")
//입력값
var text = todoText.text.toString()
//ADD면 등록 아니면 수정
if(addBtn.text.toString() == "ADD"){ //등록
//데이터 담기
val task = ToDoModel(0, text, 0)
//할 일 추가
db.addTask(task)
//조회 및 리셋
selectReset("ADD")
}else{ //수정
//할 일 수정
db.updateTask(gId, text)
//조회 및 리셋
selectReset("UPDATE")
}
//키보드 내리기
hideKeyboard(todoText)
}
//할 일 입력 체크
todoText.addTextChangedListener(object: TextWatcher{
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun onTextChanged(charSeq: CharSequence?, p1: Int, p2: Int, p3: Int) {
//텍스트 변경 시 실행
//입력값이 없으면
if(charSeq.toString() == ""){
//비활성화
addBtn.isEnabled = false
//글씨색 회색으로 변경
addBtn.setTextColor(Color.GRAY)
}else{
//활성화
addBtn.isEnabled = true
//글씨색 검정으로 변경
addBtn.setTextColor(Color.BLACK)
}
}
override fun afterTextChanged(p0: Editable?) {}
})
//스와이프( 수정, 삭제 기능)
ItemTouchHelper(object: ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT){
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
//스와이프 기능
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val position = viewHolder.absoluteAdapterPosition
when(direction){
ItemTouchHelper.LEFT -> { //삭제
//할 일 변수에 담기
val id = taskList[position].id
//아이템 삭제
adapter.removeTask(position)
//DB에서 삭제
db.deleteTask(id)
}
ItemTouchHelper.RIGHT -> { //수정
viewMode("UPDATE")
//할 일 가져오기
val task = taskList[position].task
//할 일 ID 전역변수에 담기
gId = taskList[position].id
//입력창에 수정할 할 일 넣기
todoText.setText(task)
//버튼 문구 변경
addBtn.text = "UPDATE"
}
}
}
//그리기
override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
RecyclerViewSwipeDecorator.Builder(
c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive
)
.addSwipeLeftBackgroundColor(Color.RED) //왼쪽 스와이프 배경색 설정
.addSwipeLeftActionIcon(R.drawable.ic_delete)//왼쪽 스와이프 아이콘 설정
.addSwipeLeftLabel("삭제") //왼쪽 스와이프 라벨 설정
.setSwipeLeftLabelColor(Color.WHITE)//왼쪽 스와이프 라벨 색상
.addSwipeRightBackgroundColor(Color.BLUE)//오른쪽 스와이프 배경색 설정
.addSwipeRightActionIcon(R.drawable.ic_edit)//오른쪽 스와이프 아이콘 설정
.addSwipeRightLabel("수정") //오른쪽 스와이프 라벨 설정
.setSwipeRightLabelColor(Color.WHITE)//오른쪽 스와이프 라벨 색상
.create()
.decorate()
super.onChildDraw(
c,
recyclerView,
viewHolder,
dX,
dY,
actionState,
isCurrentlyActive
)
}
}).attachToRecyclerView(recyclerView)
}//onCreate()
/**
* 조회
*/
private fun selectData(){
//조회
taskList = db.getAllTasks()
//최신순 정렬
taskList.reverse()
//데이터 담기
adapter.setTask(taskList)
//적용
adapter.notifyDataSetChanged()
}
/**
* 조회 및 리셋
*/
private fun selectReset(type: String){
//조회
selectData()
//할일 입력 초기화
todoText.setText("")
//등록이 아니면 등록으로 변경
if(type != "ADD"){
addBtn.text = "ADD"
}
}
private fun viewMode(type: String){
// 입력하고 나면 입력창 사라지고 FAB 보여줌
if(type == "FAB"){
//입력창 숨김
bottomLayout.visibility = View.GONE
//fab 보여줌
fab.visibility = View.VISIBLE
}else{
//입력창 보여줌
bottomLayout.visibility = View.VISIBLE
//fab 숨김
fab.visibility = View.INVISIBLE
}
}
/**
* 키보드 숨기기
*/
private fun hideKeyboard(editText: EditText){
val manager: InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
//키보드 숨김
manager.hideSoftInputFromWindow(editText.applicationWindowToken, 0)
}
}
2022.09.13 - [안드로이드] - [안드로이드 코틀린] 액티비티(Activity) 뒤로 가기 버튼 만드는 방법
[안드로이드 코틀린] 액티비티(Activity) 뒤로가기 버튼 만드는 방법
이번 시간에는 액티비티(Activity) 이동 후에 다시 이전 화면으로 돌아가는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 액티비티 만들기 3. 환경 설정 파일 AndroidManifest.xml 4. 메인 화면 acti
aries574.tistory.com
2022.09.08 - [안드로이드] - [안드로이드 코틀린] 달력(DatePicker) 코드에서 호출하는 방법
[안드로이드 코틀린] 달력(DatePicker) 코드에서 호출하는 방법
이번 시간에는 달력(DatePicker)을 화면이 아니라 코드에서 호출하는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 activity_main.xml 3. 메인 코드 MainActivity.kt 1. 실행 화면 2. 메인..
aries574.tistory.com
2022.09.07 - [안드로이드] - [안드로이드 코틀린] 뒤로 가기 두 번 눌러 종료하는 방법
[안드로이드 코틀린] 뒤로 가기 두 번 눌러 종료하는 방법
이번 시간에는 뒤로 가기 버튼 두 번 눌러 앱 종료하는 방법을 알아보겠습니다. 한 번 누르면 한 번 더 누르라는 알림이 뜨고, 3초 안에 다시 눌러야 종료되는 방법입니다. 목차 1. 실행 화면 2.
aries574.tistory.com
[안드로이드 코틀린] 코드(MainActivity) 에서 배경 색상 바꾸는 다양한 방법 (0) | 2022.09.20 |
---|---|
[안드로이드 코틀린] RecyclerView 홀수 행, 짝수 행 별 색상 다르게 하는 방법 (0) | 2022.09.19 |
[안드로이드 코틀린] SQLite ToDo List 만드는 방법 part2 - 할 일 화면과 어댑터 클래스 (0) | 2022.09.15 |
[안드로이드 코틀린] SQLite ToDo List 만드는 방법 part1 - Data 클래스와 DB 클래스 (0) | 2022.09.14 |
[안드로이드 코틀린] 액티비티(Activity) 뒤로가기 버튼 만드는 방법 (1) | 2022.09.13 |
댓글 영역