Oct 16, 2011

Back in history for File Explorer

In the File Explorer in former post "Start activity using intent of ACTION_VIEW, for specified MIME type", the app will quit whenever you press the BACK key. With the help of Stack and onBackPressed(), function of back in history is added.

When you navigate in the file tree, the current directory will be push onto the top of history stack. Once you press BACK key, the overrided onBackPressed() method check empty of the history stack; if not empty - load the last directory; if empty - pass to super.onBackPressed(), = quit.

package com.AndroidListFiles;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

import android.app.ListActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class AndroidListFilesActivity extends ListActivity {

private List<String> fileList = new ArrayList<String>();

Stack<File> history;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

history = new Stack<File>();

File root = new File(Environment
.getExternalStorageDirectory()
.getAbsolutePath());
ListDir(root);

}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
File selected = new File(fileList.get(position));
if(selected.isDirectory()){
ListDir(selected);
}else {
Uri selectedUri = Uri.fromFile(selected);
String fileExtension
= MimeTypeMap.getFileExtensionFromUrl(selectedUri.toString());
String mimeType
= MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);

Toast.makeText(AndroidListFilesActivity.this,
"FileExtension: " + fileExtension + "\n" +
"MimeType: " + mimeType,
Toast.LENGTH_LONG).show();

//Start Activity to view the selected file
Intent intent;
intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, mimeType);
startActivity(intent);

}
}

void ListDir(File f){

history.push(f);

File[] files = f.listFiles();
fileList.clear();
for (File file : files){
fileList.add(file.getPath());
}

ArrayAdapter<String> directoryList
= new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, fileList);
setListAdapter(directoryList);
}

@Override
public void onBackPressed() {
// TODO Auto-generated method stub

history.pop(); //remove current directory

if(history.empty()){
super.onBackPressed();
}else{
File selected = history.pop(); //Get the File on Top of history
ListDir(selected);
}

}

}


next:
- Sort the file list in order, by implementing Comparator.



1 comment:

  1. I think there should be history.peek() in the else portion of onBackPressed() otherwise it will pop two items on single backpress event
    Visit to know how to extract java and xml source files from .apk file

    ReplyDelete

Infolinks In Text Ads