android 图标资源管理器,Android资源管理器程序

news/2024/11/9 16:27:27

这是一个有图标的文件资源管理器,也许在网上的基于Android的market上有很多比较精美的文件资源管理器,这里我拿这个出来讲并不在于我做的界面如何的精美,而相反我这里的重点并不在界面,我只是想通过这么个列子和大家一起分享Android开发中的一下知识点:(1)目录的遍历(2)自定义Adapter(3)如何取得文件类型,以及调用系统打开对应的文件。这三点也是本程序的关键点所在,如果将这三个知识点掌握了,我想理解这个应用程序也就不再话下。

那么现在让我们一起来阅读代码吧,首先我们知道Android API提供的ArrayAdapter对象只允许存入String数组或List对象,所以在显示文件列表时,只能以一段字符串来显示文件的名称,如果要同时显示文件夹和文件的图标,以及文件名称,甚至文件类型、大小等信息,则必须要自定义一个实现Adapter Interface的对象,就可以自定义想要呈现的Layout,达到同时显示图片文件ICON与多个文字信息的效果,Android API中提供了BaseAdapter(Android.widget.BaseAdapter)对象,只要继承此对象就可以实现出属于自己的Adapter。

实现此范例时,须要先准备文件图标的ICON图片文件,并保存在/res/drawable/文件夹下,图片文件路径如下:

1

/res/drawable/back01.png; 回到根目录的图标

2

/res/drawable/back02.png; 回到上一层的图标

3

/res/drawable/doc.png;     文件的图标

4

/res/drawable/folder.png;   文件夹的图标

运行效果图:

源码:

package com.zchening.inote;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

import android.app.AlertDialog;

import android.app.ListActivity;

import android.content.DialogInterface;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.view.View;

import android.widget.ListView;

public class OpenActivity extends ListActivity

{

/* 变量声明

items:存放显示的名称

paths:存放文件路径

rootPath:起始目录 */

private Listitems=null;

private Listpaths=null;

private String rootPath="/";

//private TextView mPath;

private String path="";

@Override

protected void onCreate(Bundle icicle){

super.onCreate(icicle);

/* 载入main.xml Layout */

// setContentView(R.layout.main);

/* 初始化mPath,用以显示目前路径 *///@Test@??

// mPath=(TextView)findViewById(R.id.mPath);

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

getFileDir(Environment.getExternalStorageDirectory());

}else{

getFileDir(new File(rootPath));

}

}

/* 取得文件架构的方法 */

private void getFileDir(File fileDir){

/* 设置目前所在路径*/

// mPath.setText(filePath);

items=new ArrayList();

paths=new ArrayList();

File f=fileDir;

String filePath=f.getPath();

// 取得当前路径下所有文件

File[] files=f.listFiles();

// 如果不是根目录

if(!filePath.equals(rootPath))

{

/*第一笔设置为【回到根目录】 */

items.add("b1");

paths.add(rootPath);

/*第二笔设置为【回到上一层】 */

items.add("b2");

paths.add(f.getParent());

}

if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) && f.getName().equals("sdcard")){

new AlertDialog.Builder(this)

.setIcon(R.drawable.alert_dialog_icon2)

.setTitle(" SD 卡已卸载或移除,请先安装 SD 卡!")

.setPositiveButton("确定", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

Intent i=new Intent(OpenActivity.this,MainActivity.class);

startActivity(i);

}

}).show();

}

/* 将所有文件添加到ArrayList中 */

for(int i=0;i

BytesEncodingDetect用于判断文本文件的字符编码(见附件)

MyAdapter.java

package irdc.ex05_11;

/* import相关class */

import java.io.File;

import java.util.List;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

/* 自定义的Adapter,继承android.widget.BaseAdapter */

public class MyAdapter extends BaseAdapter

{

/* 变量声明

mIcon1 回到根目录的图片文件

mIcon2回到上一层的图片

mIcon3文件夹的图片文件

mIcon4文件的图片

*/

private LayoutInflater mInflater;

private Bitmap mIcon1;

private Bitmap mIcon2;

private Bitmap mIcon3;

private Bitmap mIcon4;

private List items;

private List paths;

/* MyAdapter的构造器,传入三个参数 */

public MyAdapter(Context context,List it,List pa)

{

/* 参数初始化*/

mInflater = LayoutInflater.from(context);

items = it;

paths = pa;

// 生成4张图片

mIcon1 = BitmapFactory.decodeResource(context.getResources(),R.drawable.back01);

mIcon2 = BitmapFactory.decodeResource(context.getResources(),R.drawable.back02);

mIcon3 = BitmapFactory.decodeResource(context.getResources(),R.drawable.folder);

mIcon4 = BitmapFactory.decodeResource(context.getResources(),R.drawable.doc);

}

/* 因继承BaseAdapter,需重写一下方法*/

@Override

public int getCount()

{

return items.size();

}

@Override

public Object getItem(int position)

{

return items.get(position);

}

@Override

public long getItemId(int position)

{

return position;

}

@Override

public View getView(int position,View convertView,ViewGroup parent)

{

ViewHolder holder;

if(convertView == null)

{

/* 使用自定义的file_row作为Layout */

convertView = mInflater.inflate(R.layout.file_row, null);

/* 初始化holder的text和icon */

holder = new ViewHolder();

holder.text = (TextView) convertView.findViewById(R.id.text);

holder.icon = (ImageView) convertView.findViewById(R.id.icon);

convertView.setTag(holder);

}

else

{

holder = (ViewHolder) convertView.getTag();

}

File f=new File(paths.get(position).toString());

/* 设置【回到根目录】的text和icon */

if(items.get(position).toString().equals("b1"))

{

holder.text.setText("Back to /");

holder.icon.setImageBitmap(mIcon1);

}

/*设置【回到上一层】的text和icon*/

else if(items.get(position).toString().equals("b2"))

{

holder.text.setText("Back to ..");

holder.icon.setImageBitmap(mIcon2);

}

/* 设置【文件和文件夹】的text和icon */

else

{

holder.text.setText(f.getName());

if(f.isDirectory())

{

holder.icon.setImageBitmap(mIcon3);

}

else

{

holder.icon.setImageBitmap(mIcon4);

}

}

return convertView;

}

/* class ViewHolder */

private class ViewHolder

{

TextView text;

ImageView icon;

}

}

自定义的Adapter对象,并以file_row.xml作为Layout,程序中依照文件的类型来决定要显示的图标是什么。

file_row.xml

写在最后:本范例重点在于如何通过实现自定义的Adapter对象来自定义想要呈现的Layout,以及如何在手机上实现打开文件的功能。

通过自定义的Adapter,可以在ListView中放入任何想要呈现的widget对象,如RadioButton、CheckBox、EditText等,如此一来,在开发程序时,就可以做更多样化得应用。

在主程序中自定义了openFile()这个方法来做打开文件的动作,程序内容如下

/* 调用getMIMEType()来取得MimeType */

String type = getMIMEType(f);

/* 设置intent的file和MimeType */

intent.setDataAndType(Uri.fromFile(f),type);

startActivity(intent);

其中使用intent.setDataAndType(Uri,type)来指定要打开的文件及文件的MIME Type,并以startActivity()的方式来打开文件。getMIMEType()这个方法中,依据文件的拓展名来设置文件的MIME Type,MIME Type格式为“文件类型/文件拓展名”,目前程序中针对部分类型的文件做MIME Type的判断,其余的文件则一律将MIME Type设置为“*/*”,当系统受到文件的类型为“*”时,会自动弹出应用程序的菜单,让用户自己选择要用哪个程序打开文件。

-----------------------------------------------------

部分代码参考自《Android SDK范例大全》

附件:判断文本文件的字符编码


http://www.niftyadmin.cn/n/1996610.html

相关文章

vue router 引入多个路由文件

背景:vue 项目 想把路由文件分为几个子文件,通过 export/import 的方式 引入到 index.js 中,这样做使得项目路由文件更加清晰,不至于都堆在一个文件里,难以查找。解决办法:增加子文件:xxx.jslet…

中国使用互联网每年向美国付5000亿超国防预算数额

中国使用互联网每年向美国付5000亿超国防预算数额 中央党校经济学部课题组表示,这包括域名注册费、解析费和信道资源费等宋蕾专家认为,这项研究基于美国“互联网”技术,是否得到美国专利认可是技术推广关键 当上网已融入中国1.6亿名网民的…

android 自定义启动器快捷方式,android快捷方式,访问启动器db

启动器是手机制造商责任下的应用程序.然后,管理局并不总是“com.android.launcher2.settings”.手机制造商可能会重写自己的手机.它可以是“com.android.twlauncher”或其他任何东西,具体取决于Java包.您需要通过搜索声明读/写权限“com.android.launcher.permission.READ_SETT…

android端如何接收服务端的文件在哪,Socket.io android java客户端接收消息并发送文件示例...

有没有人有任何示例代码演示在socket.io的java客户端端接收消息?另外,有没有从同一个socket.io java客户端发送文件/二进制/图片的例子? (基本上是来自java而不是javascript客户端的示例代码)可以在这里获取android java客户端的版本(此版本声称它可以与…

Google离职富翁们都在干什么

Google离职富翁们都在干什么 假如你拥有1千万或1亿美元,你会干什么?退休,每天继续去让你成为富翁的公司上班还是去追逐其它梦想? 对于上百位Google的早期员工,这是一个百万美元的问题。有人估计,当Google…

android 广播失效,android – NotificationManager.cancel(id)在广播接收器中不起作用

Android:我正在尝试在安装软件包后取消通知栏中的通知.我正在做的是以下内容:public class MyBroadcastReceiver extends BroadcastReceiver {private static final String TAG "MyBroadcastReceiver";Overridepublic void onReceive(Context…

春运购买火车票、乘车攻略

春运购买火车票、乘车攻略 author: 忘情 一年一度的春运又开始了。每年到了这时候,为了买火车票,许多人都头皮发麻吧?作为一名打小就在铁路上长大的铁路职工,尽我所掌握的情况,给大家谈谈春运买票,乘车攻…

Oracle列自增-12c

在ORACLE 12C以前的版本中,如果要实现列自增长,需要通过序列触发器实现,到了12C ORACLE 引进了Identity Columns新特性,从而实现了列自增长功能。 一、Identity Columns使用语法 GENERATED[ ALWAYS | BY DEFAULT [ ON NULL ] ]AS IDENTITY [ ( identity_options ) ]identity_op…