마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 파일탐색기 코드 관련질문입니다

0 추천


package app.main;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class FileList extends ListView {

 public FileList(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  
  init(context);
 }

 public FileList(Context context, AttributeSet attrs) {
  super(context, attrs);

  init(context);
 }

 public FileList(Context context) {
  super(context);

  init(context);
 }
 
 private void init(Context context) {
  _Context = context;
        setOnItemClickListener(_OnItemClick);
 }
 
 private Context _Context = null;
 private ArrayList<String> _List = new ArrayList<String>();
    private ArrayList<String> _FolderList = new ArrayList<String>();
    private ArrayList<String> _FileList = new ArrayList<String>();
 private ArrayAdapter<String> _Adapter = null; 
 
 // Property 
 private String _Path = "";
 
 // Event
 private OnPathChangedListener _OnPathChangedListener = null;
 private OnFileSelectedListener _OnFileSelectedListener = null;
 
 private boolean openPath(String path) {
  _FolderList.clear();
  _FileList.clear();
  
        File file = new File(path);
        File[] files = file.listFiles();
        if (files == null) return false;
        
        for (int i=0; i<files.length; i++) {
         if (files[i].isDirectory()) {
          _FolderList.add("<" + files[i].getName() + ">");
         } else {
          _FileList.add(files[i].getName());
         }
        }
        
        Collections.sort(_FolderList);
        Collections.sort(_FileList);
        
        _FolderList.add(0, "<..>");
        
        return true;
 }
 
 private void updateAdapter() {
  _List.clear();
        _List.addAll(_FolderList);
        _List.addAll(_FileList);
        
  _Adapter = new ArrayAdapter<String>(_Context, android.R.layout.simple_list_item_1, _List);
        setAdapter(_Adapter);
 }

 public void setPath(String value) {
  if (value.length() == 0) {
   value = "/";
  } else {
   String lastChar = value.substring(value.length()-1, value.length());
   if (lastChar.matches("/") == false) value = value + "/"; 
  }
  
  if (openPath(value)) {
   _Path = value;
   updateAdapter();         
   if (_OnPathChangedListener != null) _OnPathChangedListener.onChanged(value);
  }
 }

 public String getPath() {
  return _Path;
 }
 
 public void setOnPathChangedListener(OnPathChangedListener value) {
  _OnPathChangedListener = value;
 }

 public OnPathChangedListener getOnPathChangedListener() {
  return _OnPathChangedListener;
 }

 public void setOnFileSelected(OnFileSelectedListener value) {
  _OnFileSelectedListener = value;
 }

 public OnFileSelectedListener getOnFileSelected() {
  return _OnFileSelectedListener;
 }
 
 public String DelteRight(String value, String border) {
  String list[] = value.split(border);

  String result = "";
  
  for (int i=0; i<list.length; i++) {
   result = result + list[i] + border; 
  }
  
  return result;
 }
 
 private String delteLastFolder(String value) {
  String list[] = value.split("/");

  String result = "";
  
  for (int i=0; i<list.length-1; i++) {
   result = result + list[i] + "/"; 
  }
  
  return result;
 }
 
 private String getRealPathName(String newPath) {
  String path = newPath.substring(1, newPath.length()-1);
  
  if (path.matches("..")) {
   return delteLastFolder(_Path);
  } else {
   return _Path + path + "/";
  }
 }

 private AdapterView.OnItemClickListener _OnItemClick = new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int position,
    long id) {
   String fileName = getItemAtPosition(position).toString();
   if (fileName.matches("<.*>")) {
    setPath(getRealPathName(fileName));
   } else {
    if (_OnFileSelectedListener != null) _OnFileSelectedListener.onSelected(_Path, fileName);
   }
  }
 };

}

지금 퍼즐 앱을 위한 이미지를 받아오기위해 sdcard에서 직접 찾으려고 하는데요

류종택님의 티스토리에서 대강의 코드는 이해했으나

잘 모르겠으므로 질문 올려봅니다.

 

일단 저 코드로 파일탐색기 켜지는데요

문제점이... sdcard 에서 다른폴더 하나를 들어간뒤!

그다음 폴더에서 예를들면

제 핸드폰기준

 

/sdcard/Picture/ 이다음에 올 폴더에서

폴더명이 2글자 이하인걸 클릭하는 순간

파일패스가 /sdcard/ 로 돌아갑니다...

물론 그 이상 3글자라도 되는 폴더를 클릭시(예를들어 폴더명이 '가나다')면

/sdcard/Picture/가나다/

이렇게 잘 됩니다...

 

아직 안드로이드 코드 배운지 몇일 안되서 어디서 이러한 문제가 발생하는지 모르겠습니다.

일일히 폴더명을 1,2,3,4글자 바꿔가면서 정확히 몇글자 부터 오류인지 확인뒤

코드를 직접보고 어댑터뷰.온아이템클릭리스너 쪽에서

파일이름이 문자열에 저장되는걸보고, 그 파일이름을 getRealPathName에 가는거 보고 거기도 보고,

거기서 리턴해준게 setPath간것도 확인해봤지만...

제 수준으론 어째서 2글짜 짜리 폴더는 클릭하는 순간

/sdcard/Picture/두글짜 폴더명 이 아닌 예를들어 폴더명이 'ab'라면

/sdcard/Picture/ab/

/sdcard/로 변경되는지 알고싶습니다.

아 참고로 Picture안에 3글자자리가 있고

그안에 2글자 짜리가 있을때는

/sdcard/Picture/abc/ab

가 아니라

/sdcard/Picture/로 돌아갑니다.

한단계 뒤로 가버리네요...

 

 

 

 

코드초보자 (180 포인트) 님이 2015년 8월 18일 질문
코드초보자님이 2015년 8월 18일 수정

1개의 답변

0 추천
if (path.matches(".."))

위 구문에서 matches 함수는 정규식을 파라미터로 하게 되어있습니다.

그래서 두자리문자도 true가 되네요.

path.equals로 변경하세요.
코딩인헬 (12,150 포인트) 님이 2015년 8월 19일 답변
코딩인헬님이 2015년 8월 19일 수정
...