android文件管理器用法详解

很久没有写东西了,鉴于某某同学文件管理器不会,这里简单介绍一下,同时写一个demon,参考了网上别人写的代码,自己也学习学习,研究研究。

  首先所谓文件管理器,看起来就是一个列表,列表里面是文件夹或者文件,首先把布局写出来,我想在最上方的左边显示文件的路径,右边显示该路径下的文件个数,其实还是一个遍历文件,然后用列表显示出来的问题。下面是ListView,用来显示文件列表。下面是运行的效果图:

主界面的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  <RelativeLayout
    android:id="@+id/top"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
      android:id="@+id/path"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentLeft="true"
      android:layout_centerVertical="true"
      android:textSize="@*android:dimen/list_item_size"
      android:textColor="@android:color/white"/>

    <TextView
      android:id="@+id/item_count"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textSize="@*android:dimen/list_item_size"
      android:textColor="@android:color/white"
      android:layout_alignParentRight="true"
      android:layout_centerVertical="true"/>
  </RelativeLayout>
  <View
    android:layout_width="match_parent"
    android:layout_height="2dip"
    android:background="#09c"/>

  <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
      android:id="@+id/file_list"
      android:layout_height="match_parent"
      android:layout_width="match_parent"
      android:fadingEdge="none"
      android:cacheColorHint="@android:color/transparent"/>
  </LinearLayout>
</LinearLayout>

首先在oncreate方法里面调用一个方法去获取布局文件里面的id:

@Override
   protected void onCreate (Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.file_manager);
     initView();
 }

initView之后添加apk的权限,777 表示可读可写可操作。

private void initView() {
    mListView = (ListView) findViewById(R.id.file_list);
    mPathView = (TextView) findViewById(R.id.path);
    mItemCount = (TextView) findViewById(R.id.item_count);
    mListView.setOnItemClickListener(this);
    String apkRoot = "chmod 777 " + getPackageCodePath();
    RootCommand(apkRoot);
    File folder = new File("/");
    initData(folder);
  } 

修改Root权限的方法:

public static boolean RootCommand (String command) {
    Process process = null;
    DataOutputStream os = null;
    try {
      process = Runtime.getRuntime().exec("su");
      os = new DataOutputStream(process.getOutputStream());
      os.writeBytes(command + "\n");
      os.writeBytes("exit\n");
      os.flush();
      process.waitFor();
    }
    catch (Exception e) {
      return false;
    }
    finally {
      try {
        if (os != null) {
          os.close();
        }
        process.destroy();
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
    return true;
  }

完了之后我们要获取根目录下面的所有的数据,然后设置到我们的ListView中让它显示出来。

private void initData(File folder) {
    boolean isRoot = folder.getParent() == null;
    mPathView.setText(folder.getAbsolutePath());
    ArrayList<File> files = new ArrayList<File>();
    if (!isRoot) {
      files.add(folder.getParentFile());
    }
    File[] filterFiles = folder.listFiles();
    mItemCount.setText(filterFiles.length + "项");
    if (null != filterFiles && filterFiles.length > 0) {
      for (File file : filterFiles) {
        files.add(file);
      }
    }
    mFileAdpter = new FileListAdapter(this, files, isRoot);
    mListView.setAdapter(mFileAdpter);
  }

首先是获取当前是否是根目录,然后把文件的路径设置给我们要显示的View。

然后用一个ArrayList来装我们目录下的所有的文件或者文件夹。

首先要把这个文件夹的父类装到我们的列表中去,然后把这个文件夹下的子文件都拿到,也装在列表中,然后调用Adapter显示出来。既然说到了Adapter, 那就看下Adapter吧。

private class FileListAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<File> files;
    private boolean isRoot;
    private LayoutInflater mInflater;

    public FileListAdapter (Context context, ArrayList<File> files, boolean isRoot) {
      this.context = context;
      this.files = files;
      this.isRoot = isRoot;
      mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount () {
      return files.size();
    }

    @Override
    public Object getItem (int position) {
      return files.get(position);
    }

    @Override
    public long getItemId (int position) {
      return position;
    }

    @Override
    public View getView (int position, View convertView, ViewGroup parent) {
      ViewHolder viewHolder;
      if(convertView == null) {
        viewHolder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.file_list_item, null);
        convertView.setTag(viewHolder);
        viewHolder.title = (TextView) convertView.findViewById(R.id.file_title);
        viewHolder.type = (TextView) convertView.findViewById(R.id.file_type);
        viewHolder.data = (TextView) convertView.findViewById(R.id.file_date);
        viewHolder.size = (TextView) convertView.findViewById(R.id.file_size);
      } else {
        viewHolder = (ViewHolder) convertView.getTag();
      }

      File file = (File) getItem(position);
      if(position == 0 && !isRoot) {
        viewHolder.title.setText("返回上一级");
        viewHolder.data.setVisibility(View.GONE);
        viewHolder.size.setVisibility(View.GONE);
        viewHolder.type.setVisibility(View.GONE);
      } else {
        String fileName = file.getName();
        viewHolder.title.setText(fileName);
        if(file.isDirectory()) {
          viewHolder.size.setText("文件夹");
          viewHolder.size.setTextColor(Color.RED);
          viewHolder.type.setVisibility(View.GONE);
          viewHolder.data.setVisibility(View.GONE);
        } else {
          long fileSize = file.length();
          if(fileSize > 1024*1024) {
            float size = fileSize /(1024f*1024f);
            viewHolder.size.setText(new DecimalFormat("#.00").format(size) + "MB");
          } else if(fileSize >= 1024) {
            float size = fileSize/1024;
            viewHolder.size.setText(new DecimalFormat("#.00").format(size) + "KB");
          } else {
            viewHolder.size.setText(fileSize + "B");
          }
          int dot = fileName.indexOf('.');
          if(dot > -1 && dot < (fileName.length() -1)) {
            viewHolder.type.setText(fileName.substring(dot + 1) + "文件");
          }
          viewHolder.data.setText(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(file.lastModified()));
        }
      }
      return convertView;
    }

    class ViewHolder {
      private TextView title;
      private TextView type;
      private TextView data;
      private TextView size;
    }
  }

看下adapter的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  <TextView
      android:id="@+id/file_title"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textSize="25sp"
      android:textColor="#fff000"/>
  <LinearLayout
    android:id="@+id/file_info"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
      android:id="@+id/file_size"
      android:layout_width="0dip"
      android:layout_height="wrap_content"
      android:textColor="#ffffcc"
      android:layout_weight="1"
      android:textSize="18sp"/>

    <TextView
      android:id="@+id/file_type"
      android:layout_width="0dip"
      android:layout_height="wrap_content"
      android:textColor="#ffffcc"
      android:layout_weight="1"
      android:gravity="right"
      android:textSize="18sp"/>
    <TextView
      android:id="@+id/file_date"
      android:layout_width="0dip"
      android:layout_height="wrap_content"
      android:textColor="#ffffff"
      android:layout_weight="1"
      android:gravity="right"
      android:textSize="18sp"/>
  </LinearLayout>
</LinearLayout>

列表的Item项分2行显示,上面一行显示文件名

下面一行分别显示文件大小,文件类型,文件修改时间。

我们可以通过File file = (File) getItem(position);拿到Item项的文件,如果是在第一个并且不再根目录我们就把第一个也就是parentFile显示为:“返回上一级”,下一行的都隐藏掉。

如果不是第一个位置,可以拿到这个文件的一系列信息。

先把String fileName = file.getName();文件名拿到,显示出来。

如果这个文件是一个文件夹,就把文件的大小显示为“文件夹”,类型和修改时间隐藏掉。

如果不是一个文件夹, 可以拿到文件的长度long fileSize = file.length();

根据特定的长度显示文件的大小,B, KB, MB, GB等。

然后拿到文件的类型,通过最后一个“.”之后的字符串就是该文件的类型。

通过viewHolder.data.setText(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(file.lastModified())); 设置文件的最近修改时间。

然后可以设置每个Item项的点击事件,如下所示:

@Override
  public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
    File file = (File) mFileAdpter.getItem(position);
    if(!file.canRead()) {
      new AlertDialog.Builder(this).setTitle("提示").setMessage("权限不足").setPositiveButton(android.R.string.ok, new OnClickListener() {

        @Override
        public void onClick (DialogInterface dialog, int which) {

        }
      }).show();
    } else if(file.isDirectory()) {
      initData(file);
    } else {
      openFile(file);
    }
  }

如果这个文件不能读,就弹出对话框显示“权限不足”。

如果是一个文件夹,就在调用一次显示所有文件的方法:initData(file);把这个文件夹作为参数传递下去。

如果是一个文件,就可以调用打开文件的方法打开这个文件。

如何打开文件呢?

可以根据不同的文件的后缀名找到不同的文件类型:

可以用一个二维数组把一些常用的文件类型封装起来。如下:

private final String[][] MIME_MapTable = {
    // {后缀名, MIME类型}
    { ".3gp", "video/3gpp" },
    { ".apk", "application/vnd.android.package-archive" },
    { ".asf", "video/x-ms-asf" },
    { ".avi", "video/x-msvideo" },
    { ".bin", "application/octet-stream" },
    { ".bmp", "image/bmp" },
    { ".c", "text/plain" },
    { ".class", "application/octet-stream" },
    { ".conf", "text/plain" },
    { ".cpp", "text/plain" },
    { ".doc", "application/msword" },
    { ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
    { ".xls", "application/vnd.ms-excel" },
    { ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
    { ".exe", "application/octet-stream" },
    { ".gif", "image/gif" },
    { ".gtar", "application/x-gtar" },
    { ".gz", "application/x-gzip" },
    { ".h", "text/plain" },
    { ".htm", "text/html" },
    { ".html", "text/html" },
    { ".jar", "application/java-archive" },
    { ".java", "text/plain" },
    { ".jpeg", "image/jpeg" },
    { ".jpg", "image/jpeg" },
    { ".js", "application/x-javascript" },
    { ".log", "text/plain" },
    { ".m3u", "audio/x-mpegurl" },
    { ".m4a", "audio/mp4a-latm" },
    { ".m4b", "audio/mp4a-latm" },
    { ".m4p", "audio/mp4a-latm" },
    { ".m4u", "video/vnd.mpegurl" },
    { ".m4v", "video/x-m4v" },
    { ".mov", "video/quicktime" },
    { ".mp2", "audio/x-mpeg" },
    { ".mp3", "audio/x-mpeg" },
    { ".mp4", "video/mp4" },
    { ".mpc", "application/vnd.mpohun.certificate" },
    { ".mpe", "video/mpeg" },
    { ".mpeg", "video/mpeg" },
    { ".mpg", "video/mpeg" },
    { ".mpg4", "video/mp4" },
    { ".mpga", "audio/mpeg" },
    { ".msg", "application/vnd.ms-outlook" },
    { ".ogg", "audio/ogg" },
    { ".pdf", "application/pdf" },
    { ".png", "image/png" },
    { ".pps", "application/vnd.ms-powerpoint" },
    { ".ppt", "application/vnd.ms-powerpoint" },
    { ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
    { ".prop", "text/plain" },
    { ".rc", "text/plain" },
    { ".rmvb", "audio/x-pn-realaudio" },
    { ".rtf", "application/rtf" },
    { ".sh", "text/plain" },
    { ".tar", "application/x-tar" },
    { ".tgz", "application/x-compressed" },
    { ".txt", "text/plain" },
    { ".wav", "audio/x-wav" },
    { ".wma", "audio/x-ms-wma" },
    { ".wmv", "audio/x-ms-wmv" },
    { ".wps", "application/vnd.ms-works" },
    { ".xml", "text/plain" },
    { ".z", "application/x-compress" },
    { ".zip", "application/x-zip-compressed" },
    { "", "*/*" }
    };

分别对应的是后缀名和对应的文件类型。

我们可以根据文件的后缀名拿到文件的MIMEType类型:

private String getMIMEType(File file) {
    String type = "*/*";
    String fileName = file.getName();
    int dotIndex = fileName.indexOf('.');
    if(dotIndex < 0) {
      return type;
    }
    String end = fileName.substring(dotIndex, fileName.length()).toLowerCase();
    if(end == "") {
      return type;
    }
    for(int i=0; i<MIME_MapTable.length; i++) {
      if(end == MIME_MapTable[i][0]) {
        type = MIME_MapTable[i][1] ;
      }
    }
    return type;
  }

先遍历后缀名,如果找到,就把对应的类型找到并返回。

拿到了类型,就可以打开这个文件。

用这个intent.setDataAndType(Uri.fromFile(file), type); 打开设置打开文件的类型。

如果type是*/*会弹出所有的可供选择的应用程序。

到这里一个简易的文件管理器就成型了。

源代码:

package com.android.test;

import java.io.DataOutputStream;
import java.io.File;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class FileManager extends Activity implements OnItemClickListener {

  private ListView mListView;
  private TextView mPathView;
  private FileListAdapter mFileAdpter;
  private TextView mItemCount;

  @Override
  protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.file_manager);
    initView();
  }

  private void initView() {
    mListView = (ListView) findViewById(R.id.file_list);
    mPathView = (TextView) findViewById(R.id.path);
    mItemCount = (TextView) findViewById(R.id.item_count);
    mListView.setOnItemClickListener(this);
    String apkRoot = "chmod 777 " + getPackageCodePath();
    RootCommand(apkRoot);
    File folder = new File("/");
    initData(folder);
  }

  public static boolean RootCommand (String command) {
    Process process = null;
    DataOutputStream os = null;
    try {
      process = Runtime.getRuntime().exec("su");
      os = new DataOutputStream(process.getOutputStream());
      os.writeBytes(command + "\n");
      os.writeBytes("exit\n");
      os.flush();
      process.waitFor();
    }
    catch (Exception e) {
      return false;
    }
    finally {
      try {
        if (os != null) {
          os.close();
        }
        process.destroy();
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
    return true;
  }

  private void initData(File folder) {
    boolean isRoot = folder.getParent() == null;
    mPathView.setText(folder.getAbsolutePath());
    ArrayList<File> files = new ArrayList<File>();
    if (!isRoot) {
      files.add(folder.getParentFile());
    }
    File[] filterFiles = folder.listFiles();
    mItemCount.setText(filterFiles.length + "项");
    if (null != filterFiles && filterFiles.length > 0) {
      for (File file : filterFiles) {
        files.add(file);
      }
    }
    mFileAdpter = new FileListAdapter(this, files, isRoot);
    mListView.setAdapter(mFileAdpter);
  }

  private class FileListAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<File> files;
    private boolean isRoot;
    private LayoutInflater mInflater;

    public FileListAdapter (Context context, ArrayList<File> files, boolean isRoot) {
      this.context = context;
      this.files = files;
      this.isRoot = isRoot;
      mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount () {
      return files.size();
    }

    @Override
    public Object getItem (int position) {
      return files.get(position);
    }

    @Override
    public long getItemId (int position) {
      return position;
    }

    @Override
    public View getView (int position, View convertView, ViewGroup parent) {
      ViewHolder viewHolder;
      if(convertView == null) {
        viewHolder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.file_list_item, null);
        convertView.setTag(viewHolder);
        viewHolder.title = (TextView) convertView.findViewById(R.id.file_title);
        viewHolder.type = (TextView) convertView.findViewById(R.id.file_type);
        viewHolder.data = (TextView) convertView.findViewById(R.id.file_date);
        viewHolder.size = (TextView) convertView.findViewById(R.id.file_size);
      } else {
        viewHolder = (ViewHolder) convertView.getTag();
      }

      File file = (File) getItem(position);
      if(position == 0 && !isRoot) {
        viewHolder.title.setText("返回上一级");
        viewHolder.data.setVisibility(View.GONE);
        viewHolder.size.setVisibility(View.GONE);
        viewHolder.type.setVisibility(View.GONE);
      } else {
        String fileName = file.getName();
        viewHolder.title.setText(fileName);
        if(file.isDirectory()) {
          viewHolder.size.setText("文件夹");
          viewHolder.size.setTextColor(Color.RED);
          viewHolder.type.setVisibility(View.GONE);
          viewHolder.data.setVisibility(View.GONE);
        } else {
          long fileSize = file.length();
          if(fileSize > 1024*1024) {
            float size = fileSize /(1024f*1024f);
            viewHolder.size.setText(new DecimalFormat("#.00").format(size) + "MB");
          } else if(fileSize >= 1024) {
            float size = fileSize/1024;
            viewHolder.size.setText(new DecimalFormat("#.00").format(size) + "KB");
          } else {
            viewHolder.size.setText(fileSize + "B");
          }
          int dot = fileName.indexOf('.');
          if(dot > -1 && dot < (fileName.length() -1)) {
            viewHolder.type.setText(fileName.substring(dot + 1) + "文件");
          }
          viewHolder.data.setText(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(file.lastModified()));
        }
      }
      return convertView;
    }

    class ViewHolder {
      private TextView title;
      private TextView type;
      private TextView data;
      private TextView size;
    }
  }

  @Override
  public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
    File file = (File) mFileAdpter.getItem(position);
    if(!file.canRead()) {
      new AlertDialog.Builder(this).setTitle("提示").setMessage("权限不足").setPositiveButton(android.R.string.ok, new OnClickListener() {

        @Override
        public void onClick (DialogInterface dialog, int which) {

        }
      }).show();
    } else if(file.isDirectory()) {
      initData(file);
    } else {
      openFile(file);
    }
  }

  private void openFile(File file) {
    Intent intent = new Intent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setAction(Intent.ACTION_VIEW);
    String type = getMIMEType(file);
    intent.setDataAndType(Uri.fromFile(file), type);
    try {
      startActivity(intent);
    }
    catch (Exception e) {
      Toast.makeText(this, "未知类型,不能打开", Toast.LENGTH_SHORT).show();
    }
  }

  private String getMIMEType(File file) {
    String type = "*/*";
    String fileName = file.getName();
    int dotIndex = fileName.indexOf('.');
    if(dotIndex < 0) {
      return type;
    }
    String end = fileName.substring(dotIndex, fileName.length()).toLowerCase();
    if(end == "") {
      return type;
    }
    for(int i=0; i<MIME_MapTable.length; i++) {
      if(end == MIME_MapTable[i][0]) {
        type = MIME_MapTable[i][1] ;
      }
    }
    return type;
  }

  private final String[][] MIME_MapTable = {
    // {后缀名, MIME类型}
    { ".3gp", "video/3gpp" },
    { ".apk", "application/vnd.android.package-archive" },
    { ".asf", "video/x-ms-asf" },
    { ".avi", "video/x-msvideo" },
    { ".bin", "application/octet-stream" },
    { ".bmp", "image/bmp" },
    { ".c", "text/plain" },
    { ".class", "application/octet-stream" },
    { ".conf", "text/plain" },
    { ".cpp", "text/plain" },
    { ".doc", "application/msword" },
    { ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
    { ".xls", "application/vnd.ms-excel" },
    { ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
    { ".exe", "application/octet-stream" },
    { ".gif", "image/gif" },
    { ".gtar", "application/x-gtar" },
    { ".gz", "application/x-gzip" },
    { ".h", "text/plain" },
    { ".htm", "text/html" },
    { ".html", "text/html" },
    { ".jar", "application/java-archive" },
    { ".java", "text/plain" },
    { ".jpeg", "image/jpeg" },
    { ".jpg", "image/jpeg" },
    { ".js", "application/x-javascript" },
    { ".log", "text/plain" },
    { ".m3u", "audio/x-mpegurl" },
    { ".m4a", "audio/mp4a-latm" },
    { ".m4b", "audio/mp4a-latm" },
    { ".m4p", "audio/mp4a-latm" },
    { ".m4u", "video/vnd.mpegurl" },
    { ".m4v", "video/x-m4v" },
    { ".mov", "video/quicktime" },
    { ".mp2", "audio/x-mpeg" },
    { ".mp3", "audio/x-mpeg" },
    { ".mp4", "video/mp4" },
    { ".mpc", "application/vnd.mpohun.certificate" },
    { ".mpe", "video/mpeg" },
    { ".mpeg", "video/mpeg" },
    { ".mpg", "video/mpeg" },
    { ".mpg4", "video/mp4" },
    { ".mpga", "audio/mpeg" },
    { ".msg", "application/vnd.ms-outlook" },
    { ".ogg", "audio/ogg" },
    { ".pdf", "application/pdf" },
    { ".png", "image/png" },
    { ".pps", "application/vnd.ms-powerpoint" },
    { ".ppt", "application/vnd.ms-powerpoint" },
    { ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
    { ".prop", "text/plain" },
    { ".rc", "text/plain" },
    { ".rmvb", "audio/x-pn-realaudio" },
    { ".rtf", "application/rtf" },
    { ".sh", "text/plain" },
    { ".tar", "application/x-tar" },
    { ".tgz", "application/x-compressed" },
    { ".txt", "text/plain" },
    { ".wav", "audio/x-wav" },
    { ".wma", "audio/x-ms-wma" },
    { ".wmv", "audio/x-ms-wmv" },
    { ".wps", "application/vnd.ms-works" },
    { ".xml", "text/plain" },
    { ".z", "application/x-compress" },
    { ".zip", "application/x-zip-compressed" },
    { "", "*/*" }
    };
}

最后补充一下,布局文件中的dimension是编译到jar包里面去了的,没有jar包的童鞋可以改成自己定义大小。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android编写简易文件管理模块

    最近在做一个将word文档导入到SQLite的程序.对于文件选择问题,经过再三考虑决定写一个简易的文件管理模块,用来选择需要导入的文件文件 先看下效果图: 思路: 获取存储器接口 遍历当前目录 利用ListView显示文件文件夹 先是布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

  • Android获取手机文件夹及文件列表的方法

    先看看效果图: package wuwang.tools.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Comparator; import

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

    核心代码: File fatherFile = new File(path);File[] files = fatherFile.listFiles(); 效果图: 实现这种列表式的目录,用直接读取目录下文件方法会比较简单,但是如果要根据文件类型从所有文件中分类,那就用ContentProvider去查询数据库方式会更有效率: 实现代码: FileListActivity.java package com.example.d_readandwritetextfile; import java.i

  • android文件管理器用法详解

    很久没有写东西了,鉴于某某同学文件管理器不会,这里简单介绍一下,同时写一个demon,参考了网上别人写的代码,自己也学习学习,研究研究. 首先所谓文件管理器,看起来就是一个列表,列表里面是文件夹或者文件,首先把布局写出来,我想在最上方的左边显示文件的路径,右边显示该路径下的文件个数,其实还是一个遍历文件,然后用列表显示出来的问题.下面是ListView,用来显示文件列表.下面是运行的效果图: 主界面的布局文件如下: <?xml version="1.0" encoding=&qu

  • Android SurfaceView基础用法详解

    Android 游戏开发框架核心组件 核心组件介绍 SurfaceView 介绍 SurfaceView 介绍 SurfaceView 就是带 Surface 的 view,它是一个 View,是 View 的子类,所以和其他 View 一样,可以在屏幕上展示东西接收用户输入,具有 View 的生命周期回调函数,如 onMeasure.onLayout.onDraw.onTouchEvent 等 SurfaceView 带有独立的 Surface(独立与 window 的 surface),这可

  • python爬虫中的url下载器用法详解

    前期的入库筛选工作已经由url管理器完成了,整理的工作自然要由url下载器接手.当我们需要爬取的数据已经去重后,下载器的主要任务的是这些数据下载下来.所以它的使用也并不复杂,不过需要借助到我们之前所学过的一个库进行操作,相信之前的基础大家都学的很牢固.下面小编就来为大家介绍url下载器及其使用的方法. 下载器的作用就是接受URL管理器传递给它的一个url,然后把该网页的内容下载下来.python自带有urllib和urllib2等库(这两个库在python3中合并为urllib),它们的作用就是

  • Android SQLite基本用法详解

    目录 一.SQLite的介绍 1.SQLite简介 2.SQLite的特点: 3.SQLite数据类型 二.SQLiteDatabase的介绍 1.打开或者创建数据库 2.创建表 3.插入数据 4.删除数据 5.修改数据 6.查询数据 7.删除指定表 三. SQLiteOpenHelper 1.onCreate(SQLiteDatabase) 2.  onUpgrade(SQLiteDatabase,int,int)  3.  onOpen(SQLiteDatabase): 一.SQLite的介

  • Android之Spinner用法详解

    目录 一.Spinner的两种展示样式 二.Spinner相关方法 三.Spinner用法举例 XML布局文件activity_main.xml 选中文字样式item_select.xml 列表其他文字样式item_dropdown.xml Java代码MainActivity.java 四.dropdown模式下的列表分割线 一.Spinner的两种展示样式 下拉列表的展示方式有两种,一种是在当前下拉框的正下方展示列表,此时把spinnerMode属性设置为dropdown;另一种是在页面中部

  • Android SharedPreferences存储用法详解

    先看Demo运行效果 SharedPreferences详解 SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activity暂停时,将此activity的状态保存到SharedPereferences中:当Activity重载,系统回调方法onSaveInstanceState时,再从SharedPreferences中将值取出. SharedPreferences提供了java常规的Long.Int.Strin

  • Python中的装饰器用法详解

    本文实例讲述了Python中的装饰器用法.分享给大家供大家参考.具体分析如下: 这里还是先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: 复制代码 代码如下: @makebold @makeitalic def say():    return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出的答案是: 复制代码 代码如下: def makebold(fn):    

  • PHP模板引擎Smarty内置变量调解器用法详解

    本文实例讲述了PHP模板引擎Smarty内置变量调解器用法.分享给大家供大家参考,具体如下: Smarty 中的变量调解器相当于函数,其调用方式为:通过 "|" 后面直接跟调解器函数名,如果有参数,得加在 ":" 后面,多个参数的话,累加即可. 下面为您介绍 Smarty 中内置的变量调解器: 1.capitalize 将变量里的所有单词首字大写.参数值 boolean 型决定带数字的单词,首字是否大写.默认不大写 index.php $tpl->assign

  • Android WebView组件用法详解

    本文实例讲述了Android WebView组件用法.分享给大家供大家参考,具体如下: 如果想WebView能够访问网络,必须在AndroidManifest.xml里面添加权限 <uses-permission android:name="android.permission.INTERNET" /> main.xml很简单,就是一个WebView <?xml version="1.0" encoding="utf-8"?&g

  • Android中Parcel用法详解

    本文实例讲述了Android中Parcel用法.分享给大家供大家参考,具体如下: Android 中Parcel 的使用,他是一个存储基本数据类型和引用数据类型的容器,在andorid 中通过IBinder来绑定数据在进程间传递数据. Parcel parcel = Parcel.obtain();// 获取一个Parcel 对象 下面就可以对其进行方法进行操作了,createXXX(),wirteXXX(),readXXX(), 其中dataPosition(),返回当前Parcel 当前对象

随机推荐