Android 응용 프로그램 에서 로 컬 파일 과 디 렉 터 리 를 선택 한 실례 공 유 를 실현 합 니 다
오늘 은 파일 선택 기의 역할 을 공유 합 니 다.구체 적 으로 는 사용자 가 SD 카드 에서 선택 한 파일/폴 더 경 로 를 가 져 오 는 것 입 니 다.C\#에서 OpenFileDialog 컨트롤 과 유사 합 니 다.기능 이 실현 되 기 가 비교적 간단 한데,주로 모두 가 개발 시간 을 절약 하도록 돕 는 것 이다.
인터넷 에 널리 퍼 진 완제품 은 다음 과 같다.그 밖 에 주요 특징 은 다음 과 같다.
1.사용자 가 Back 키 를 누 른 이 벤트 를 감청 하여 이전 디 렉 터 리 로 되 돌려 줍 니 다.
2.서로 다른 파일 형식(파일 vs 폴 더,대상 파일 vs 다른 파일)에 대해 특수 처 리 를 했 습 니 다.
지식 포인트 1.File 류 의 사용
파일 선택 기의 주요 기능 은 파일\폴 더,파일 형식 등 을 탐색 하 는 것 입 니 다.모두 자바 File 클래스 를 통 해 이 루어 집 니 다.
지식 점 2.호출 방법 설명
startActivity ForResult()호출 및 onActivity Result()방법 으로 리 셋 된 정 보 를 받 았 습 니 다.
캡 처 는 다음 과 같 습 니 다.
다른 것 도 할 말 이 없 으 니 코드 주석 을 보 세 요~~ so easy - - 。
FileChooser Activity.java 에서 파일 선택 을 실현 하 는 클래스 입 니 다.
public class CopyOfFileChooserActivity extends Activity {
private String mSdcardRootPath ; //sdcard
private String mLastFilePath ; //
private ArrayList<FileInfo> mFileLists ;
private FileChooserAdapter mAdatper ;
//
private void setGridViewAdapter(String filePath) {
updateFileItems(filePath);
mAdatper = new FileChooserAdapter(this , mFileLists);
mGridView.setAdapter(mAdatper);
}
// , Adatper
private void updateFileItems(String filePath) {
mLastFilePath = filePath ;
mTvPath.setText(mLastFilePath);
if(mFileLists == null)
mFileLists = new ArrayList<FileInfo>() ;
if(!mFileLists.isEmpty())
mFileLists.clear() ;
File[] files = folderScan(filePath);
if(files == null)
return ;
for (int i = 0; i < files.length; i++) {
if(files[i].isHidden()) //
continue ;
String fileAbsolutePath = files[i].getAbsolutePath() ;
String fileName = files[i].getName();
boolean isDirectory = false ;
if (files[i].isDirectory()){
isDirectory = true ;
}
FileInfo fileInfo = new FileInfo(fileAbsolutePath , fileName , isDirectory) ;
//
mFileLists.add(fileInfo);
}
//When first enter , the object of mAdatper don't initialized
if(mAdatper != null)
mAdatper.notifyDataSetChanged(); //
}
//
private File[] folderScan(String path) {
File file = new File(path);
File[] files = file.listFiles();
return files;
}
private AdapterView.OnItemClickListener mItemClickListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position,
long id) {
FileInfo fileInfo = (FileInfo)(((FileChooserAdapter)adapterView.getAdapter()).getItem(position));
if(fileInfo.isDirectory()) // ,
updateFileItems(fileInfo.getFilePath()) ;
else if(fileInfo.isPPTFile()){ // ppt ,
Intent intent = new Intent();
intent.putExtra(EXTRA_FILE_CHOOSER, fileInfo.getFilePath());
setResult(RESULT_OK , intent);
finish();
}
else { // .....
toast(getText(R.string.open_file_error_format));
}
}
};
public boolean onKeyDown(int keyCode , KeyEvent event){
if(event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode()
== KeyEvent.KEYCODE_BACK){
backProcess();
return true ;
}
return super.onKeyDown(keyCode, event);
}
//
public void backProcess(){
// sdcard , , 。
if (!mLastFilePath.equals(mSdcardRootPath)) {
File thisFile = new File(mLastFilePath);
String parentFilePath = thisFile.getParent();
updateFileItems(parentFilePath);
}
else { // sdcard ,
setResult(RESULT_CANCELED);
finish();
}
}
}
화면 이 여전히 추 합 니 다.여러분 은 수요 에 따라 이 를 바탕 으로 기능 을 추가 할 수 있 습 니 다.아래 에서 디 렉 터 리 를 선택 하 는 것 도 대체적으로 같 습 니 다.디 렉 터 리 선택 기
chooserdialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="40dip">
<Button
android:layout_width="40dip"
android:layout_height="40dip"
android:text="HOME"
android:id="@+id/btn_home"
android:layout_gravity="left"
android:layout_weight="1"
/>
<LinearLayout android:layout_width="140dip"
android:layout_height="35dip"
android:id="@+id/dir_layout"
android:gravity="center"
android:layout_weight="1">
</LinearLayout>
<!-- <TextView
android:layout_width="140dip"
android:layout_height="35dip"
android:id="@+id/dir_str"
android:gravity="center"
android:layout_weight="1"
/> -->
<Button
android:layout_width="40dip"
android:layout_height="40dip"
android:text="BACK"
android:id="@+id/btn_back"
android:layout_gravity="right"
android:layout_weight="1"
/>
</LinearLayout>
<ListView
android:layout_width="fill_parent"
android:layout_height="300dip"
android:id="@+id/list_dir"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_ok"
android:text="OK"/>
</LinearLayout>
package hkp.dirchooser;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class DirChooserDialog extends Dialog implements android.view.View.OnClickListener{
private ListView list;
ArrayAdapter<String> Adapter;
ArrayList<String> arr=new ArrayList<String>();
Context context;
private String path;
private TextView title;
private EditText et;
private Button home,back,ok;
private LinearLayout titleView;
private int type = 1;
private String[] fileType = null;
public final static int TypeOpen = 1;
public final static int TypeSave = 2;
/**
* @param context
* @param type 1 ,2
* @param fileType ,null
* @param resultPath OK , +
*/
public DirChooserDialog(Context context,int type,String[]fileType,String resultPath) {
super(context);
// TODO Auto-generated constructor stub
this.context = context;
this.type = type;
this.fileType = fileType;
this.path = resultPath;
}
/* (non-Javadoc)
* @see android.app.Dialog#dismiss()
*/
@Override
public void dismiss() {
// TODO Auto-generated method stub
super.dismiss();
}
/* (non-Javadoc)
* @see android.app.Dialog#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.chooserdialog);
path = getRootDir();
arr = (ArrayList<String>) getDirs(path);
Adapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1, arr);
list = (ListView)findViewById(R.id.list_dir);
list.setAdapter(Adapter);
list.setOnItemClickListener(lvLis);
home = (Button) findViewById(R.id.btn_home);
home.setOnClickListener(this);
back = (Button) findViewById(R.id.btn_back);
back.setOnClickListener(this);
ok = (Button) findViewById(R.id.btn_ok);
ok.setOnClickListener(this);
titleView = (LinearLayout) findViewById(R.id.dir_layout);
if(type == TypeOpen){
title = new TextView(context);
titleView.addView(title);
title.setText(path);
}else if(type == TypeSave){
et = new EditText(context);
et.setWidth(240);
et.setHeight(70);
et.setGravity(Gravity.CENTER);
et.setPadding(0, 2, 0, 0);
titleView.addView(et);
et.setText("wfFileName");
}
// title = (TextView) findViewById(R.id.dir_str);
// title.setText(path);
}
// ListView
Runnable add=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
arr.clear();
//System.out.println("Runnable path:"+path);
// arr
List<String> temp = getDirs(path);
for(int i = 0;i < temp.size();i++)
arr.add(temp.get(i));
Adapter.notifyDataSetChanged();
}
};
private OnItemClickListener lvLis=new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
String temp = (String) arg0.getItemAtPosition(arg2);
//System.out.println("OnItemClick path1:"+path);
if(temp.equals(".."))
path = getSubDir(path);
else if(path.equals("/"))
path = path+temp;
else
path = path+"/"+temp;
//System.out.println("OnItemClick path2"+path);
if(type == TypeOpen)
title.setText(path);
Handler handler=new Handler();
handler.post(add);
}
};
private List<String> getDirs(String ipath){
List<String> file = new ArrayList<String>();
//System.out.println("GetDirs path:"+ipath);
File[] myFile = new File(ipath).listFiles();
if(myFile == null){
file.add("..");
}else
for(File f: myFile){
//
if(f.isDirectory()){
String tempf = f.toString();
int pos = tempf.lastIndexOf("/");
String subTemp = tempf.substring(pos+1, tempf.length());
// String subTemp = tempf.substring(path.length(),tempf.length());
file.add(subTemp);
//System.out.println("files in dir:"+subTemp);
}
//
if(f.isFile() && fileType != null){
for(int i = 0;i< fileType.length;i++){
int typeStrLen = fileType[i].length();
String fileName = f.getPath().substring(f.getPath().length()- typeStrLen);
if (fileName.toLowerCase().equals(fileType[i])) {
file.add(f.toString().substring(path.length()+1,f.toString().length()));
}
}
}
}
if(file.size()==0)
file.add("..");
// System.out.println("file[0]:"+file.get(0)+" File size:"+file.size());
return file;
}
/* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v.getId() == home.getId()){
path = getRootDir();
if(type == TypeOpen)
title.setText(path);
Handler handler=new Handler();
handler.post(add);
}else if(v.getId() == back.getId()){
path = getSubDir(path);
if(type == TypeOpen)
title.setText(path);
Handler handler=new Handler();
handler.post(add);
}else if(v.getId() == ok.getId()){
dismiss();
if(type == TypeSave)
path = path+"/"+et.getEditableText().toString()+".wf";
Toast.makeText(context, path, Toast.LENGTH_SHORT).show();
}
}
private String getSDPath(){
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED); // sd
if(sdCardExist)
{
sdDir = Environment.getExternalStorageDirectory();//
}
if(sdDir == null){
//Toast.makeText(context, "No SDCard inside!",Toast.LENGTH_SHORT).show();
return null;
}
return sdDir.toString();
}
private String getRootDir(){
String root = "/";
path = getSDPath();
if (path == null)
path="/";
return root;
}
private String getSubDir(String path){
String subpath = null;
int pos = path.lastIndexOf("/");
if(pos == path.length()){
path = path.substring(0,path.length()-1);
pos = path.lastIndexOf("/");
}
subpath = path.substring(0,pos);
if(pos == 0)
subpath = path;
return subpath;
}
}
package hkp.dirchooser;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.btn_open);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String path = null;
String [] fileType = {"dst"};//
DirChooserDialog dlg = new DirChooserDialog(MainActivity.this,2,fileType,path);
dlg.setTitle("Choose dst file dir");
dlg.show();
}
});
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.