파일 탐색기를 사용하면 파일과 폴더 타입에 따라서 폴더 이동이 가능해야 합니다.
오늘은 코틀린(Kotlin)을 이용한 탐색기 세 번째 파트 파일 탐색기 이벤트 연동에 대해서 알아보겠습니다.
파일 탐색기 이벤트 연동은 파일, 폴더를 구분해서 재 탐색을 해야 합니다.
먼저 FilesListFragment에서 OnItemClickListener 이벤트 변수를 선언합니다.
아래쪽에 interface를 사용해서 onClick, onLogClick 함수를 선언합니다.
private lateinit var eCallback: OnItemClickListener
interface OnItemClickListener{
fun onClick(fileModel : FileModel)
fun onLongClick(fileModel : FileModel)
}
override onAttach를 선언하고 OnItemClickListener로 캐스팅하여 eCallback에 연결합니다.
onAttach는 실행 시점에 호출되기 때문에 오류를 방지하기 위해서 catch를 사용해서 오류를 정의합니다.
override fun onAttach(context: Context?) {
super.onAttach(context)
try{
eCallback = context as OnItemClickListener
} catch( e: Exception){
throw Exception("${context} FileListFragment onAttach")
}
}
FilesListFragment 클래스를 MainActivity에 상속합니다.
클래스명을 선언하면 OnItemClickListener 이벤트를 확인할 수 있습니다.
FilesListFragment 클래스는 interface로 onClick, onLongClick를 선언했기 때문에 상속을 받게 되면 interface를 선언해야 오류가 발생하지 않습니다.
onClick, onLongClick를 override하여 선언합니다.
onClick이벤트가 발생하면 container에 View를 실행하고 파일 정보를 넘겨줄 수 있는 AddFileFragment를 선언합니다.
override fun onClick(fileModel: FileModel) {
}
override fun onLongClick(fileModel: FileModel) {
}
private fun AddFileFragment(fileModel: FileModel){
val filesListFragment = FilesListFragment.build {
path = fileModel.path
}
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.container, filesListFragment)
fragmentTransaction.addToBackStack(fileModel.path)
fragmentTransaction.commit()
}
onClick 이벤트에 폴더일 경우 파일 경로를 저장하기 위해서 AddFileFragment를 연결합니다.
스택에 더 이상 확인할 내용이 없을 경우 종료할 수 있게 onBackPressed를 override 해줍니다.
override fun onBackPressed(){
super.onBackPressed()
if( supportFragmentManager.backStackEntryCount ==0){
finish()
}
}
파일을 선택하면 파일 확장자에 연결된 앱을 실행하기 위해서 이벤트를 연동해야 합니다.
FileUtils.kt파일에 앱을 실행할 수 있는 함수 launchFileIntent를 선언합니다.
fun Context.launchFileIntent(fileModel: FileModel) {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = FileProvider.getUriForFile(this, packageName, File(fileModel.path))
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
startActivity(Intent.createChooser(intent, "Select Application"))
}
launchFileintent 함수는 fileModel 경로에 확인된 확장자에 따라서 설치된 앱을 실행합니다.
폴더가 아닐 경우 launchFileIntent 함수를 사용해서 앱 실행을 적용합니다.
override fun onClick(fileModel: FileModel) {
if( fileModel.fileType == FileType.FOLDER){
AddFileFragment(fileModel)
}else{
launchFileIntent(fileModel)
}
}
onClick 함수는 폴더일 경우 AddFileFragment를 재 호출하여 리스트를 생성합니다.
파일 경우 launchFileIntent 함수를 사용해서 앱을 실행하고 뒤로 가기를 클릭하면 다시 폴더 리스트를 호출합니다.
마지막으로 InitViews함수에서 초기화 시점에 mFilesAdapter에 클릭 이벤트를 연동합니다.
mFilesAdapter.onItemClickListener = {
eCallback.onClick(it)
}
mFilesAdapter.onItemLongClickListener = {
eCallback.onLongClick(it)
}
onItemClickListener, onItemLongClickListener 함수에 eCallback 이벤트를 연동하면 리스트 클릭 시점에 eCallback가 호출되면서 이벤트가 연동됩니다.
컴파일해서 실행하면 리스트에서 하위 폴더가 있을 경우 리스트가 변경되는 것을 확인할 수 있습니다.
폴더 하단에 아무것도 없을 경우는 "there is nothing here" View를 확인할 수 있습니다.
파일을 클릭하면 연결된 앱 실행 여부를 확인하고 앱을 실행할 수 있습니다.
탐색기를 사용한 이벤트 연동은 어렵게 보이지만, 기본은 간단한 이벤트 연동이기 때문에 조금만 보면 바로 확인할 수 있습니다.
다음 시간에는 파일 경로를 확인할 수 있는 로직을 추가해보겠습니다.
감사합니다.
http://thetechnocafe.com/build-a-file-explorer-in-kotlin-part-3-navigating-through-file-system/
'IT 나라 > 코틀린(Kotlin)' 카테고리의 다른 글
android How to solve ' java.lang.ClassNotFoundException: Didn't find class "com.google.android.material.appbar.AppBarLayout"' (0) | 2021.09.28 |
---|---|
[ Kotlin ] assets를 이용한 XML 파서 (0) | 2021.09.13 |
[ Kotlin ] 코틀린 파일 탐색기 만들기 2 (0) | 2021.08.25 |
[ Kotlin ] 코틀린 파일 탐색기 만들기 1 (0) | 2021.08.19 |
[ Kotlin ] 코틀린 안드로이드 카메라 원본 이미지 저장 방법 (0) | 2021.05.10 |