`

简易sd卡文件浏览

阅读更多
activity_main.xml, 增加剪头, 和空文件夹提示
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <RelativeLayout
        android:id="@+id/relative_layout"
        android:layout_width="fill_parent"
        android:layout_height="45dip"
        android:background="@drawable/list_item_background_normal" >

        <RelativeLayout
            android:id="@+id/current_path_pane"
            android:layout_width="fill_parent"
            android:layout_height="40dip"
            android:layout_alignParentLeft="true"
            android:layout_marginRight="48dip"
            android:background="@drawable/path_pane_bg"
            android:layout_marginTop="1dip" >

            <ImageView
                android:id="@+id/img_arrow"
                android:layout_width="30dip"
                android:layout_height="16dip"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:contentDescription="@string/img_des"
                 />

            <TextView
                android:id="@+id/txt_current_path"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@id/img_arrow"
                android:ellipsize="start"
                android:singleLine="true"
                android:textSize="12sp" />
        </RelativeLayout>

        <ImageView
            android:id="@+id/img_up_level"
            android:layout_width="40dip"
            android:layout_height="40dip"
            android:layout_alignParentRight="true"
            android:contentDescription="@string/img_des"
            android:src="@drawable/img_back_btn_press" />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/relative_layout"
        android:layout_marginBottom="5dip" >

        <ListView
            android:id="@+id/fileListView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:cacheColorHint="#00000000" >
        </ListView>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout_empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical"
        android:visibility="visible" >

        <ImageView
            android:id="@+id/img_no_sub_file"
            android:layout_width="80dip"
            android:layout_height="80dip"
            android:background="@drawable/empty_icon"
            android:contentDescription="@string/img_des" />

        <TextView
            android:id="@+id/txtEmpty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/txt_empty"
            android:textColor="#9D9D9D"
            android:textSize="20sp" />
    </LinearLayout>

</RelativeLayout>


pop_window.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/pathListView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:cacheColorHint="#00000000"
        android:divider="#00000000" >
    </ListView>

</LinearLayout>


抽出MainActivity中文件处理代码成FileUtil类。
package com.lxm.filebrowser;

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

import android.util.Log;

/**
 * 
 * @author lxmgfd
 *
 */
public class FileUtil
{
	/**
	 * 实际使用的数据
	 * @param files
	 * @return
	 */
	public static List<String> getPath(String[] files)
	{
		List<String> list = new ArrayList<String>();
		int len = files.length - 1;
		for (int i = 0; i < len; i++) 
		{
			list.add(files[i]);
		}
		return list;
	}
	
	/**
	 * 用于界面显示的数据, 树状
	 * @param files
	 * @return
	 */
	public static List<String> getTree(String[] files)
	{
		List<String> list = new ArrayList<String>();
		int len = files.length - 1;
		String temp = "";
		
		for (int i = 0; i < len; i++) 
		{
			temp = getSpaceByCount(i)+files[i];
			list.add(temp);
			Log.v("test", "i="+i+" temp="+temp);
		}
		return list;
	}
	
	/**
	 * 设置树形前缀
	 * 如:
	 *   └─XXX
	 * @param count
	 * @return
	 */
	public static String getSpaceByCount(int count)
	{
		StringBuffer sbSpace = new StringBuffer();
		String space = "     ";
		String line = "└─";
		count = count + 1; 
		for (int i = 0; i < count; i++) 
		{
			sbSpace.append(space);
		}
		sbSpace.append(line);
		return sbSpace.toString();
	}
	
	/**
	 * 根据当前点击的目录获得当前目录
	 * @param list
	 * @param index
	 * @return
	 */
	public static String getCurPath(List<String> list, int index)
	{
		StringBuffer path = new StringBuffer();
		int len = list.size();
		String temp = "";
		for (int i = 0; i < len; i++) 
		{
			if (i > index) 
			{
				break;
			}
			
			if (i == 0)  // 代表根节点
			{
				temp = list.get(i);
			} 
			else 
			{
				temp = File.separator+list.get(i);
			}
			
			path.append(temp);
		}
		return path.toString();
	}
	
	/**
	 * 获得指定路径下面的文件名或目录名
	 * @param path
	 * @return
	 */
	public static List<String> getFilesByPath(String path)
	{
		List<String> list = new ArrayList<String>();
		File[] files = new File(path).listFiles();
		String name = "";
		
		for (File file : files) 
		{
			name = file.getName();
			list.add(name);
		}
		return list;
	}
}



MainActivity修改其中的弹窗为成员变量, 更好的控制弹窗无需重绘多次。
package com.lxm.filebrowser;

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

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**
 * 
 * @author lxmgfd
 *
 */
public class MainActivity extends Activity 
{
	private RelativeLayout mCurrentPathPane;   	// 文件路径布局
	private LinearLayout mEmptyFile;		   	// 没有文件布局	
	private TextView mTxtCurrentPath;		   	// 当前路径	
	private ImageView mImgUpLevel;			 	// 放回上一级图片按钮 
	private ImageView mImgArrow;				// 剪头图片按钮
	private PopupWindow mPopWindow;				// 弹窗
	
	private ListView mListView;					// 显示当前目录下的listview
	private StringArrayAdapter mAdapter;		
	private ListView mPopListView;				// 弹窗listview
	private StringArrayAdapter mPopAdapter;
	
	private String root;						// SDcard根目录
	private String curPath;
	private List<String> subPathList;			// 当前目录下的文件集合
	private List<String> listPath;				// 弹窗使用的目录集合
	
	private String SDCARD = "SD卡";
	private int ARROW_UP = R.drawable.arrow_up;
	private int ARROW_DOWN = R.drawable.arrow_down;
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initUI();
	}

	private void initUI() 
	{
		root = Environment.getExternalStorageDirectory().toString();
		curPath = root;
		mCurrentPathPane = (RelativeLayout) findViewById(R.id.current_path_pane);
		mEmptyFile = (LinearLayout) findViewById(R.id.layout_empty);
		mTxtCurrentPath = (TextView) findViewById(R.id.txt_current_path);
		mImgUpLevel = (ImageView) findViewById(R.id.img_up_level);
		mImgArrow = (ImageView) findViewById(R.id.img_arrow);
		mListView = (ListView) findViewById(R.id.fileListView);
		
		initPopWindow();
		changePath();
		
		mCurrentPathPane.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if (curPath.equals(root)) 
				{
					return;
				}
				showPopWindow();
			}
		});
		
		mImgUpLevel.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				curPath = new File(curPath).getParentFile().toString();
				changePath();
				closePopWindow();
			}
		});
		
		mListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				String temp = curPath + File.separator + subPathList.get(position);
				File file = new File(temp);
				if (file.isDirectory())  // 当前文件为目录则进入该目录。
				{
					curPath = temp;
					changePath();
				}
			}
		});
	}
	
	/**
	 * 当前目录发生变化时调用函数, 修改当前目录位置, 设置返回按钮是否显示, 设置当前目录下的所有文件
	 */
	private void changePath()
	{
		setCurrentPath(mTxtCurrentPath, curPath.replace(root, SDCARD));
		showImgView();
		
		setListViewValue();
		showEmptyFileView();
	}
	
	/**
	 * 设置按钮上面的文字
	 * @param txtView
	 * @param strText
	 */
	private void setCurrentPath(TextView txtView, String strText){
		txtView.setText(strText);
	}
	
	/**
	 * 显示返回按钮和剪头
	 */
	private void showImgView()
	{
		int flag = View.VISIBLE;
		if (curPath.equals(root)) 
		{
			flag = View.INVISIBLE;
		}
		mImgArrow.setVisibility(flag);
		setArrowDirection(ARROW_DOWN);
		mImgUpLevel.setVisibility(flag);
	}
	
	private void setArrowDirection(int dir)
	{
		mImgArrow.setBackgroundResource(dir);
	}
	
	/**
	 * 列出当前文件目录下所有文件
	 */
	private void setListViewValue()
	{
		subPathList = FileUtil.getFilesByPath(curPath);
		if (null == mAdapter)
		{
			mAdapter = new StringArrayAdapter(getApplicationContext(), subPathList, 1);
		}
		
		mAdapter.setList(subPathList);
		mListView.setAdapter(mAdapter);
	}
	
	/**
	 * 是否显示没有文件
	 */
	private void showEmptyFileView()
	{
		int flag = View.GONE;
		if (subPathList.size() < 1) 
		{
			flag = View.VISIBLE;
		}
		mEmptyFile.setVisibility(flag);
	}

	/**
	 * 初始化弹窗
	 */
	@SuppressWarnings("deprecation")
	@SuppressLint("InflateParams")
	private void initPopWindow()
	{		
		LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
		View view = inflater.inflate(R.layout.pop_window, null);
		mPopWindow = new PopupWindow(findViewById(R.id.mainLayout), LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
		mPopWindow.setContentView(view);
		mPopWindow.setFocusable(false);  
        mPopWindow.setBackgroundDrawable(new BitmapDrawable());
        
		mPopListView = (ListView) view.findViewById(R.id.pathListView);
        mPopListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				clickPopItem(position);
				closePopWindow();
			}
		} );
	}
	
	/**
	 * 处理点击位置
	 * @param position
	 */
	private void clickPopItem(int position)
	{
		if (curPath.endsWith(listPath.get(position)) == false) 
		{
			curPath = FileUtil.getCurPath(listPath, position);
			changePath();
		}
	}
	
	/**
	 * 显示弹窗
	 * @param view
	 */
	private void showPopWindow()
 	{
		if (mPopWindow.isShowing() == false) 
		{
			setPopListViewValue();
			mPopWindow.showAsDropDown(findViewById(R.id.relative_layout));
			mPopWindow.setOutsideTouchable(false);
			setArrowDirection(ARROW_UP);
		}
		else 
		{
			closePopWindow();
		}
 	}
	
	/**
	 * 关闭
	 */
	private void closePopWindow() 
	{
		mPopWindow.dismiss();
		setArrowDirection(ARROW_DOWN);
	}

	/**
	 * 设置弹窗数据
	 */
	private void setPopListViewValue()
	{
		if (curPath.equals(root)) 
		{
			return ;
		}
		
		String path = curPath.replace(root + File.separator, "");
		String[] files = path.split(File.separator);
		List<String> listTree = new ArrayList<String>();  // UI显示数据
		listPath = new ArrayList<String>();				  // 实际使用数据

		listPath.add(root);		// 添加根节点
		listPath.addAll(FileUtil.getPath(files));
		
		listTree.add(SDCARD);   // 添加根节点
		listTree.addAll(FileUtil.getTree(files));
		
		if (null == mPopAdapter) 
		{
			mPopAdapter = new StringArrayAdapter(this, listTree, 2);  
		}
		mPopAdapter.setList(listTree);
		mPopListView.setAdapter(mPopAdapter);
	}
}










  • 大小: 15.9 KB
  • 大小: 21.1 KB
0
2
分享到:
评论

相关推荐

    Android简易sd卡文件浏览器

    这个"Android简易sd卡文件浏览器"就是一个这样的工具,它允许用户浏览SD卡上的文件,并选择特定文件,然后返回该文件的路径,以便其他应用或服务可以使用这个路径进行文件操作,如上传。 在Android系统中,访问SD卡...

    Android GetSDTree(简单SD卡文件浏览器).zip

    Android设备上的文件管理是用户日常操作的重要环节,而“Android GetSDTree”就是一个针对SD卡的简易文件浏览器,它允许用户方便地浏览和管理手机存储中的文件和目录。 一、Android 文件系统简介 Android 文件系统...

    AndroidGetSDTree(简单SD卡文件浏览器).rar

    AndroidGetSDTree是一个简易的SD卡文件浏览器应用,它为用户提供了方便的界面来查看和管理Android设备上的SD卡内容。这款应用的核心在于其源码,它揭示了Android系统中如何访问和操作文件系统的知识,这对于Android...

    Android应用源码之GetSDTree(简单SD卡文件浏览器)_SD.zip

    本篇将深入探讨一款名为GetSDTree的Android应用源码,它是一个简单的SD卡文件浏览器,旨在帮助用户方便地浏览和管理存储在SD卡上的文件。我们将从以下几个方面对源码进行分析: 1. **文件系统访问**: 在Android...

    Android代码-GetSDTree(简单SD卡文件浏览器).zip

    《Android代码实现:GetSDTree——简易SD卡文件浏览器》 在Android开发中,与文件系统打交道是一项常见的任务。GetSDTree项目是一个简单的SD卡文件浏览器应用,它可以帮助用户查看和管理存储在SD卡上的文件和目录。...

    Android应用源码简易文件浏览管理器项目.zip

    此外,`android.provider.MediaStore`可以用来访问媒体文件,而`Environment`类则用于获取外部存储(SD卡)的路径。 6. **Activity与Intent**: `Activity`是Android应用中的一个基本组件,代表用户界面的一个屏幕。...

    安卓Android源码——GetSDTree(简单SD卡文件浏览器).zip

    标题中的“安卓Android源码——GetSDTree(简单SD卡文件浏览器)”暗示了这是一个用于在Android设备上浏览SD卡文件的简易应用项目。这个项目可能包含一个简单的用户界面,允许用户查看并管理SD卡上的文件和目录。接...

    安卓简易文件目录选择器

    1. **目录遍历**:程序会遍历Android设备上的所有文件夹,包括外部存储(如SD卡)和内部存储。这使得用户能够访问到系统的所有可读取目录。 2. **用户交互界面**:设计了一个直观的UI,展示文件系统的层级结构,...

    Fragment制作的简易多媒体文件管理器

    在这个"Fragment制作的简易多媒体文件管理器"项目中,我们看到开发者利用Fragment来创建了一个专门针对TV端的多媒体文件浏览应用。下面将详细解析这个项目的相关知识点。 首先,Fragment的使用:Fragment是Android ...

    Android编写简易文件管理模块

    例如,`getExternalStorageDirectory()`方法可以获取外部存储(通常是SD卡)的根目录。同时,Android 6.0(API 级别23)及以上版本需要申请`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限。 接着,遍历...

    android简易文件管理器实例(列表式文件目录)

    此外,考虑到不同设备的存储结构,不要忘了处理外部存储卡(SD卡)的路径,如本例中的`sdRootPath = Environment.getExternalStorageDirectory().getAbsolutePath()`。 总的来说,这个简易文件管理器实例提供了一个...

    简陋的文件管理

    Android设备有多种存储空间,包括内部存储(Internal Storage)、外部存储(External Storage,又分为可卸载的和不可卸载的)以及外部SD卡。开发者需要根据数据的重要性和隐私性来选择合适的存储位置。内部存储通常...

    文件浏览器

    在"Android应用源码简易文件浏览管理器项目"中,我们可以深入学习以下技术点: 1. **Android开发环境**:包括Android Studio IDE、Gradle构建系统以及Android SDK的使用。 2. **Activity和Fragment**:文件浏览器...

    基于STM32的简易照相机设计(2016年5月30日).docx

    【文件系统和图像存储】使用特定的文件系统库,STM32F407可以对SD卡进行格式化和文件操作,将图像数据以BMP格式写入文件,确保数据的可靠存储和读取。 【用户交互】设计中的按键控制允许用户选择不同的操作,如拍照...

    安卓简易pdf阅读器的设计生大学学位论文.doc

    1. 功能需求:能够阅读PDF文件、支持多任务处理、支持SD卡存储等。 2. 性能需求:能够快速加载PDF文件、支持高效的浏览体验等。 3. 用户体验需求:能够提供友好的用户界面、支持多种语言等。 六、简易PDF阅读器的...

    简易交易网

    在实际开发中,简易交易网还需要考虑其他方面,如支付接口的集成,支持多种支付方式如信用卡、支付宝、微信支付等;用户体验优化,提供清晰的界面和流畅的操作流程;以及后台数据分析,帮助管理者了解销售情况,优化...

    TestMusic(简易音乐播放器)

    - 文件路径处理:Android应用需要处理外部存储(SD卡)的权限,以读取或保存音乐文件。 4. **媒体库集成**: - MediaScannerConnection:当添加新音乐或更新音乐库时,开发者可能使用此API来扫描设备上的媒体文件...

    android 小型资源管理器

    【Android小型资源管理器】是一个自行开发的应用程序,旨在帮助用户轻松浏览并管理SD卡上的文件和目录。这款简易的资源管理器实现了基本的文件查看和操作功能,如浏览目录结构以及通过长按操作删除文件。尽管应用在...

Global site tag (gtag.js) - Google Analytics