✏️ 일기장 앱을 내장 메모리가 아닌 sd카드의 mydiary 폴더에 저장되도록 작업. 단, SD카드에 mydiary가 없으면 kotlin 코드에서 자동 생성되게 함
xml 코드
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">
<DatePicker
android:id="@+id/datePicker"
android:datePickerMode="spinner"
android:calendarViewShown="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="20dp"
android:background="#E7D9F6"
android:layout_weight="1"
android:lines="8"/>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:text="BUTTON" />
</LinearLayout>
MainActivity 코드
class MainActivity : AppCompatActivity() {
lateinit var datePicker: DatePicker
lateinit var editText: EditText
lateinit var btn: Button
lateinit var fileName: String
/* 추가된 코드 */
lateinit var savePath: String // 저장 경로
var isFlag = false // 디렉토리 생성을 저장
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "간단 일기장"
// 접근 권한 요청
ActivityCompat.requestPermissions(this,
arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),
Context.MODE_PRIVATE)
datePicker = findViewById(R.id.datePicker)
editText = findViewById(R.id.editText)
btn = findViewById(R.id.btn)
val calendar = Calendar.getInstance()
val calendarYear = calendar.get(Calendar.YEAR)
val calendarMonth = calendar.get(Calendar.MONTH)
val calendarDay = calendar.get(Calendar.DAY_OF_MONTH)
// 외부 경로 지정
savePath = Environment.getExternalStorageDirectory().absolutePath + "/MyDiary"
fileName = "${calendarYear}_${calendarMonth + 1}_${calendarDay}.txt"
val str = readDiary(fileName) // 날짜에 해당하는 일기 파일을 읽기
editText.setText(str) // 에디트텍스트에 일기 내용을 출력
btn.isEnabled = true // 버튼 활성화
datePicker.init(
calendarYear,
calendarMonth,
calendarDay,
DatePicker.OnDateChangedListener() { datePicker: DatePicker, year: Int, month: Int, day: Int ->
makeDir() // 새로운 디렉토리 생성 함수 ( 있으면 다시 생성 x )
fileName = "${year}_${month + 1}_${day}.txt"
val string = readDiary(fileName) // 날짜에 해당하는 파일을 읽기
editText.setText(string) // 에디트텍스트에 일기 내용을 출력
Toast.makeText(applicationContext, fileName, Toast.LENGTH_SHORT).show()
btn.isEnabled = true // 버튼 활성화
})
btn.setOnClickListener {
val outputStream = FileOutputStream("$savePath/$fileName") // 지정 경로 이름으로 저장
val string = editText.text.toString() // 입력값 저장
outputStream.write(string.toByteArray())
outputStream.close()
Toast.makeText(applicationContext, "${fileName} 이 저장됨", Toast.LENGTH_SHORT).show()
}
}
private fun readDiary(fileName: String): String? {
var diaryStr: String? = null
val inputStream: FileInputStream
try {
inputStream = FileInputStream("${savePath}/${fileName}") // 지정 파일 불러오기
val txt = ByteArray(inputStream.available())
inputStream.read(txt)
inputStream.close()
diaryStr = txt.toString(Charsets.UTF_8).trim()
btn.text = "수정하기"
} catch (e: IOException) {
editText.hint = "일기 없음"
btn.text = "새로 저장"
}
return diaryStr;
}
private fun makeDir() {
if (!isFlag) { // 외부에 디렉토리가 생성되어 있지 않으면 생성
// 저장 경로 생성
val myDir = File(savePath)
myDir.mkdir()
isFlag = true
}
}
}
[ 내용 참고 : IT 학원 강의 ]
'Android Studio' 카테고리의 다른 글
[Andorid Studio] 메뉴와 대화 상자 | option menu & context menu (0) | 2024.05.05 |
---|---|
[Android Studio] 간단한 이미지 뷰어 앱 (0) | 2024.05.05 |
[Android Studio] 간단한 일기장 만들기 (0) | 2024.05.02 |
[Android Studio] 파일 처리 응용 | SD카드 파일 읽기 · 파일 생성 · 목록 출력 (0) | 2024.05.02 |
[Android Studio] 파일 처리 | openFileInput() & openFileOutput() & openRawResource() (0) | 2024.05.01 |