在我们的手持设备中,一般都会自带设备公司自己开发的文件管理系统、拍照系统之类的东东,今天我给大伙说说入门级开发的文件夹管理器,代码贼少

总共就6个类吧,没有夹杂其他外部应用,就是一个纯文件夹管理器

APP主要功能设计:文件复制、文件夹复制、批量文件/文件夹复制、删除文件、删除文件夹、批量删除文件/文件夹、文件分类、文件搜索暂时没有写,

有兴趣的可以自己写写

APP主要应用:DrawerLayout 、ListView、Fragment、IO、序列化、文件过滤、文件排序、ActionBar、Adapter、v4包、一些事件等

下面开始讲开发吧,首先我们要给APP读写权限,在清单文件配置如下权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

主界面活动代码:

package com.example.maozhuafile;
/*** 文件管理主界面* @author Engineer-Jsp* @date 2014.10.27* */
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.maozhuafile.MainActivity.FragmentA.FragmentB;
import com.example.maozhuafile.MainActivity.FragmentA.FragmentC;
import com.example.maozhuafile.MainActivity.FragmentA.FragmentD;
import com.example.util.CustomFileFilter;
import com.example.util.FileOpreationUitl;
import com.example.util.FileSort;
import com.example.util.FragmentAdapter;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.Cursor;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity implements OnItemClickListener {private ActionBar actionbar;private ActionBarDrawerToggle drawertoggle;private DrawerLayout drawerLayout;private ListView drawerlistview;private String[] drawerdata;private SimpleAdapter adapter;private List<Map<String, Object>> draweralllist = new ArrayList<Map<String, Object>>();private FragmentA fragmentA;private FragmentB fragmentB;private FragmentC fragmentC;  private FragmentD fragmentD;private int[] list_image = { R.drawable.cunchu, R.drawable.music,R.drawable.movies, R.drawable.photos };private static int index = -1;private static File currentpath;private static File SDpath;
//  private static File[] mfileData;private static Context mContext;public  static boolean exit;private static boolean copy;private static MenuItem paste;int i=0;private static EditText newFile;private static FileOpreationUitl opreaFile=new FileOpreationUitl();protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = MainActivity.this;initDrawerLayout();//initDrawerContent();//if (null == savedInstanceState) {// 如果为空代表第一次执行fragmentA = new FragmentA();fragmentB = new FragmentB();fragmentC = new FragmentC();fragmentD = new FragmentD();// 动态添加android.app.FragmentManager fg = getFragmentManager();fg.beginTransaction().add(R.id.drawer_frame_a, fragmentA).commit();}}private void initDrawerContent() {drawerdata = getResources().getStringArray(R.array.array);drawerlistview = (ListView) findViewById(R.id.drawer_list);for (int i = 0; i < drawerdata.length; i++) {Map<String, Object> drawer_list_date = new HashMap<String, Object>();drawer_list_date.put("image", list_image[i]);drawer_list_date.put("text", drawerdata[i]);draweralllist.add(drawer_list_date);}adapter = new SimpleAdapter(this, draweralllist, R.layout.drawer_item,new String[] { "image", "text" }, new int[] {R.id.drawer_imageView, R.id.drawer_textView });drawerlistview.setAdapter(adapter);drawerlistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);// 单选模式drawerlistview.setItemChecked(0, true);// 默认选中第一项drawerlistview.setOnItemClickListener(this);}private void initDrawerLayout() {drawerLayout = (DrawerLayout) findViewById(R.id.chouti);actionbar = getActionBar();actionbar.setDisplayHomeAsUpEnabled(true);drawertoggle = new ActionBarDrawerToggle(this,// 活动drawerLayout,// 布局R.drawable.ic_drawer,// 图片资源R.string.drawer_open,// 打开显示文字R.string.app_name) {// 关闭显示文字public void onDrawerOpened(View drawerView) {actionbar.setTitle(R.string.drawer_open);if (index != -1) {actionbar.setTitle(drawerdata[index]);} else {actionbar.setTitle(R.string.app_name);}invalidateOptionsMenu();// 选项菜单重绘改变super.onDrawerOpened(drawerView);}public void onDrawerClosed(View drawerView) {if (index != -1) {actionbar.setTitle(drawerdata[index]);} else {actionbar.setTitle(R.string.app_name);}invalidateOptionsMenu();// 选项菜单重绘改变super.onDrawerClosed(drawerView);}};drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, Gravity.START);drawerLayout.setDrawerListener(drawertoggle);}// 替换抽屉开关上的图片(向上箭头三道杠)protected void onPostCreate(Bundle savedInstanceState) {super.onPostCreate(savedInstanceState);drawertoggle.syncState();}public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);paste=menu.findItem(R.id.paste);return true;}// 选项菜单的预处理方法重写public boolean onPrepareOptionsMenu(Menu menu) {// 如果抽屉被打开if (drawerLayout.isDrawerOpen(Gravity.START)) {// 找到这个AcionBarMenu(操作欄菜單)Item把可见性显示为false(即显示为不可见)menu.findItem(R.id.action_menu_new).setVisible(false);}return super.onPrepareOptionsMenu(menu);}public boolean onOptionsItemSelected(MenuItem item) {// 抽屉开关控制Open,Offif (drawertoggle.onOptionsItemSelected(item)) {return true;}switch(item.getItemId()){case R.id.paste:copy=false;fragmentA.Paste();for(;i<fragmentA.filelist.size();i++){
//              if(fragmentA.filelist.get(i).exists()){
//                  new AlertDialog.Builder(this)
//                  .setTitle("复制提示")
//                  .setMessage("已存在文件"+fragmentA.filelist.get(i).getName())
//                  .setPositiveButton("覆盖", new OnClickListener() {
//                      public void onClick(DialogInterface dialog, int which) {
//                      }
//                  })
//                  .setNegativeButton("取消", null)
//                  .show();opreaFile.copyDirectory(fragmentA.filelist.get(i), currentpath);
//              }}fragmentA.filelist.clear();fragmentA.openFile(currentpath);Log.d("Paete-XXXXXXXXXXX", "xxxxxxxxxxxx");fragmentA.showMessage("执行粘贴");break;case R.id.action_menu_new:View view=LayoutInflater.from(this).inflate(R.layout.list_item, null);newFile=(EditText)view.findViewById(R.id.newFile);new AlertDialog.Builder(this).setTitle("新建文件").setView(view).setPositiveButton("确定", new OnClickListener() {public void onClick(DialogInterface dialog, int which) {String newfile="/"+fragmentA.showpath.getText().toString()+"/"+newFile.getText().toString()+"/";File newfile2=new File(newfile);Log.d("***********", newfile);if(!newfile2.exists()){  newfile2.mkdirs();}fragmentA.filelist.clear();fragmentA.openFile(currentpath);fragmentA.showMessage("执行新建");} }).setNegativeButton("取消", null)  .show();break;case R.id.action_menu_search:break;}return super.onOptionsItemSelected(item);}public void onItemClick(AdapterView<?> parent, View view, int position,long id) {drawerLayout.closeDrawer(Gravity.START);//更新ActionBar(操作栏)的标题actionbar.setTitle(drawerdata[position]);index=position;//抽屉列表按钮switch (position) {case 0:getFragmentManager().beginTransaction().replace(R.id.drawer_frame_a, fragmentA).commit();break;case 1:getFragmentManager().beginTransaction().replace(R.id.drawer_frame_a, fragmentB).commit();break;case 2:getFragmentManager().beginTransaction().replace(R.id.drawer_frame_a, fragmentC).commit();break;case 3:getFragmentManager().beginTransaction().replace(R.id.drawer_frame_a, fragmentD).commit();break;default:break;}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if(keyCode==KeyEvent.KEYCODE_BACK){if(currentpath.equals(SDpath)){if(!exit){//exit==falsefragmentA.showMessage("在点返回则退出程序!");exit=true;}else{finish();}}else{exit=false;  File path=currentpath.getParentFile();fragmentA.openFile(path);fragmentA.showpath.setText(String.valueOf(path));fragmentA.adapter.notifyDataSetChanged();}return true;  }return super.onKeyDown(keyCode, event);}public static class FragmentA extends Fragment implementsMultiChoiceModeListener, OnItemClickListener {public static TextView showpath;private ListView listview;private FragmentAdapter adapter;
//      private File[] files;private File[] mfileData;int n;private List<File> filelist=new ArrayList<File>();//下段注释代码表示往Map里面添加文件数据,如果filename为文件夹,则设置为图标icon[1],否则设置icon[0]//private int[] icon = { R.drawable.wenjian, R.drawable.wenjianjia };//Map<String,Object> map=new HaspMap<String,Object>();//map.put("keyname",filename.isDirectory?icon[1]:icon[0]);public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {Log.d("onCreateView.........", "onCreateView.........");View view  = inflater.inflate(R.layout.fragment_a, container, false);showpath=(TextView)view.findViewById(R.id.showpath);listview = (ListView) view.findViewById(R.id.listView);//
//          if (mfileData == null) {
//              SDpath = Environment.getExternalStorageDirectory();
//              showpath.setText(String.valueOf(SDpath));
//               mfileData = SDpath.listFiles(new CustomFileFilter()); // 过滤.文件
//               mfileData = FileSort.sortFile(mfileData);//排序
//               openFile(SDpath);
//          }//bindData();  return view;}// 绑定数据public void bindData() { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 判断sd卡是否正常if (mfileData == null) {SDpath = Environment.getExternalStorageDirectory();showpath.setText(String.valueOf(SDpath));getFileData();}//判断文件夹数据组是否取到了数据for (int i = 0; i < mfileData.length; i++) {Log.i("float1", "111111" + mfileData[i] + "");}} else {showMessage("SD卡出现异常");}}private File[] getFileData() {mfileData = SDpath.listFiles(new CustomFileFilter()); // 过滤.文件mfileData = FileSort.sortFile(mfileData);//排序openFile(SDpath);return mfileData;}public void Paste() {if (copy) {paste.setVisible(true);paste.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);} else {paste.setVisible(false);paste.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);}}public boolean onActionItemClicked(ActionMode mode, MenuItem item) {SparseBooleanArray array = listview.getCheckedItemPositions();switch (item.getItemId()) {
//          case R.id.newfile:
//       q      showMessage(""+"新建");
//              break;
//          case R.id.search:
//              showMessage(""+"搜索");
//              break;case R.id.remove://这处理下面这个稀疏数组时尽量不要使用静方法态调用和静态变量//静态不能再次调用静态,否则报异常for (int i = 0; i < array.size(); i++) {Log.d("del-4XXXXXXXXXXX", mfileData[array.keyAt(i)].getName().toString());if(array.valueAt(i)==true){n= array.keyAt(i);opreaFile.deleteFile(mfileData[n]);}Log.d("del-XXXXXXXXXXX", currentpath.listFiles().toString());Log.d("del-XXXXXXXXXXX", currentpath.getName().toString());Log.d("del-XXXXXXXXXXX", showpath.getText().toString());}  openFile(currentpath);showMessage("删除成功");
//              showMessage("删除"+mfileData[array.keyAt(n)].isFile()?"删除文件成功!":"删除文件夹成功!");mode.finish();case R.id.copy:copy=true;Paste();//屏蔽复制按钮
//              mode.getMenu().findItem(R.id.copy).setVisible(false);
//              //显示粘贴按钮
//              mode.getMenu().findItem(R.id.paste).setVisible(true);for(int i=0;i<array.size();i++){if(array.valueAt(i)==true){int x=array.keyAt(i);filelist.add(mfileData[x]);}}Log.d("Copy-XXXXXXXXXXX", "xxxxxxxxxxxx");mode.finish();
//              showMessage(""+"复制");break;
//          case R.id.paste:
//              copy=false;
//              Paste();
//              for(int i=0;i<filelist.size();i++){
//                  opreaFile.copyDirectory(filelist.get(i), currentpath);
//              }
//              filelist.clear();
//              openFile(currentpath);
//              Log.d("Paete-XXXXXXXXXXX", "xxxxxxxxxxxx");
//              showMessage("执行粘贴");
//              mode.finish();showMessage(""+"粘贴");
//              break;default:break;}return true;}public boolean onCreateActionMode(ActionMode mode, Menu menu) {getActivity().getMenuInflater().inflate(R.menu.action_menu, menu);
//          mode.setTitle("你選擇了");return true;}public void onDestroyActionMode(ActionMode arg0) {}public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {return false; }public void onItemCheckedStateChanged(ActionMode mode, int position,long id, boolean checked) {int count = listview.getCheckedItemCount();mode.setTitle(count + "项");}  public void onItemClick(AdapterView<?> parent, View view, int position,long id) {File file = mfileData[position];showpath.setText(String.valueOf(file)); Log.d("onItem-xxxxxxxxxxxxxx", showpath.getText().toString());if(file.isDirectory()){openFile(file);adapter.notifyDataSetChanged();}else{//打開文件Uri uri = Uri.fromFile(file);Log.d("aaaaaaaaaaaaaa", uri.toString());String[] projection = { MediaStore.Files.FileColumns.MIME_TYPE };Cursor cursor = getActivity().getContentResolver().query(MediaStore.Files.getContentUri("external"), projection,MediaStore.Files.FileColumns.DATA + "=?",new String[] { file.getAbsoluteFile().toString() },null);cursor.moveToNext();String mime = cursor.getString(0);Log.d("bbbbbbbbbbbbbb", mime);// MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(uri, mime);getActivity().startActivity(intent);} }public void openFile(File path) {currentpath=path;mfileData = path.listFiles(new CustomFileFilter()); // 过滤.文件mfileData= FileSort.sortFile(mfileData); // 排序adapter = new FragmentAdapter(mfileData,getActivity());listview.setAdapter(adapter);for (int i = 0; i < mfileData.length; i++) {Log.i("XXXXXXXXXXXX", "111111111111" + mfileData[i] + "");}
//                      showMessage("当前文件夹有"+mfileData.length+"个对象");listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listview.setMultiChoiceModeListener(FragmentA.this);listview.setOnItemClickListener(this);}public void showMessage(String info) {Toast.makeText(mContext, info, 1000).show();  }public static class FragmentB extends Fragment {private ListView mp3list;private SimpleAdapter mp3adapter;public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_b, container, false);mp3list=(ListView)view.findViewById(R.id.mp3listView);opreaFile.getReciver(SDpath);mp3adapter=new SimpleAdapter(getActivity(),opreaFile.mp3_data,R.layout.mp3_fragment_b,new String[]{opreaFile.mp3_listitem},new int[]{R.id.mp3textView});mp3list.setAdapter(mp3adapter);return view;}  }public static class FragmentC extends Fragment {private ListView video_list;private SimpleAdapter video_adapter;public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_c, container, false);video_list=(ListView)view.findViewById(R.id.video_listView);Log.d("2_XXXXXXXXXX", SDpath.getName().toString());opreaFile.getVideo(SDpath);video_adapter=new SimpleAdapter(getActivity(),opreaFile.video_data,R.layout.video_fragment_b,new String[]{opreaFile.video_listitem},new int[]{R.id.video_textView});video_list.setAdapter(video_adapter);return view;}}public static class FragmentD extends Fragment {private ListView picture_list;private SimpleAdapter picture_adapter; public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate  (R.layout.fragment_d, container, false);picture_list=(ListView)view.findViewById(R.id.picture_listView);opreaFile.getPicture(SDpath);picture_adapter=new SimpleAdapter(getActivity(),opreaFile.picture_data,R.layout.picture_fragment_b,new String[]{opreaFile.picture_listitem}, new int[]{R.id.picture_textView});picture_list.setAdapter(picture_adapter);  return view;  }}
}
/*  public static class AsyncTaskTest extends AsyncTask<String, Integer, Integer>{@Overrideprotected Result doInBackground(Params... arg0) {return null;}}*/
}

主布局:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/chouti"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><FrameLayout android:id="@+id/drawer_frame_a"android:layout_width="match_parent"android:layout_height="match_parent"/><FrameLayout android:id="@+id/drawer_frame_b"android:layout_width="match_parent"android:layout_height="match_parent"/><ListView android:id="@+id/drawer_list"android:layout_width="240dp"android:layout_height="match_parent"android:layout_gravity="start"android:background="#eee"/></android.support.v4.widget.DrawerLayout>

文件列表 Item 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/drawer_bg"><ImageViewandroid:id="@+id/filelist_imageview"android:layout_width="24dp"android:layout_height="24dp"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginLeft="18dp"android:layout_marginTop="10dp"android:src="@drawable/photos"/><TextViewandroid:id="@+id/filelist_textview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_marginLeft="17dp"android:layout_toRightOf="@+id/filelist_imageview"android:gravity="center_vertical"android:text="showfiletext" /><TextViewandroid:id="@+id/filelist_timeText"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignLeft="@+id/filelist_textview"android:layout_alignParentRight="true"android:layout_below="@+id/filelist_textview"android:text="time" /></RelativeLayout>

自定义Adapter,控制文件与应用图片配对,队号入座,ViewHolder 节约内存资源:

package com.example.util;
/*** 自定义容器Adapter* @author Engineer-Jsp* @date 2014.10.27* */
import java.io.File;
import java.util.Date;
import com.example.maozhuafile.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;public class FragmentAdapter extends BaseAdapter {private Context mContext ;  private File[] mfileData ;private LayoutInflater mlayoutinflater;public FragmentAdapter( File[]files ,Context pContext) {mContext = pContext ;mfileData = files ;mlayoutinflater = LayoutInflater.from(mContext);}public  void updata(File[] pfile){mfileData = pfile ;}public int getCount() {return mfileData ==null? 0: mfileData.length;}public Object getItem(int position) {return mfileData[position];}public long getItemId(int position) {return position;}public static  class ViewHolder{public ImageView mFileImage ;public TextView mFileName ;public TextView mFileTime;}public View getView(int position, View convertView, ViewGroup parent) {ViewHolder mViewHolder ;View _view = convertView ;if(_view ==null){mViewHolder = new ViewHolder() ;_view = mlayoutinflater.inflate(R.layout.file_listview, null) ;mViewHolder.mFileImage =(ImageView) _view.findViewById(R.id.filelist_imageview) ;mViewHolder.mFileName = (TextView) _view.findViewById(R.id.filelist_textview) ;mViewHolder.mFileTime = (TextView) _view.findViewById(R.id.filelist_timeText);_view.setTag(mViewHolder) ;}else{mViewHolder = (ViewHolder) _view.getTag() ;}//       目录的显示特点if(mfileData[position].isDirectory() && mfileData[position].canRead()){
//          文件夹分为空与非空if(mfileData[position].listFiles().length == 0 && mfileData[position].listFiles()== null  ){mViewHolder.mFileImage.setImageResource(R.drawable.wenjian) ;mViewHolder.mFileName.setText(mfileData[position].getName()) ;mViewHolder.mFileTime.setText(new Date(System.currentTimeMillis()).toLocaleString());}else{mViewHolder.mFileImage.setImageResource(R.drawable.wenjianjia) ;mViewHolder.mFileName.setText(mfileData[position].getName()) ;mViewHolder.mFileTime.setText(new Date(System.currentTimeMillis()).toLocaleString());}}else{   //文件的处理String _FileName = mfileData[position].getName().toLowerCase() ;if(_FileName.endsWith(".txt")){  //文本显示tmViewHolder.mFileImage.setImageResource(R.drawable.wenjian) ;mViewHolder.mFileName.setText(_FileName) ; mViewHolder.mFileTime.setText(new Date(System.currentTimeMillis()).toLocaleString());}else if(_FileName.endsWith(".png") || _FileName.endsWith(".jpg") ||_FileName.endsWith(".jpeg") || _FileName.endsWith(".gif")){mViewHolder.mFileImage.setTag(mfileData[position].getAbsolutePath()) ;mViewHolder.mFileImage.setImageResource(R.drawable.ic_action_picture);mViewHolder.mFileName.setText(_FileName) ;  mViewHolder.mFileTime.setText(new Date(System.currentTimeMillis()).toLocaleString());}else if(_FileName.endsWith(".mp4")|| _FileName.endsWith(".avi")|| _FileName.endsWith(".3gp") || _FileName.endsWith(".rmvb")){mViewHolder.mFileImage.setImageResource(R.drawable.ic_action_video) ;mViewHolder.mFileName.setText(_FileName) ; mViewHolder.mFileTime.setText(new Date(System.currentTimeMillis()).toLocaleString());}else if(_FileName.endsWith("mp3")){mViewHolder.mFileImage.setImageResource(R.drawable.mp3) ;mViewHolder.mFileName.setText(mfileData[position].getName()) ; mViewHolder.mFileTime.setText(new Date(System.currentTimeMillis()).toLocaleString());}else if(_FileName.endsWith("doc")){mViewHolder.mFileImage.setImageResource(R.drawable.word) ;mViewHolder.mFileName.setText(mfileData[position].getName()) ; mViewHolder.mFileTime.setText(new Date(System.currentTimeMillis()).toLocaleString());}}/*   View view = convertView ;view =mlayoutinflater.inflate(com.example.jsp.R.layout.list_item, null) ;TextView tv = (TextView)view.findViewById(com.example.jsp.R.id.tv_name1) ;tv.setText(mfileData[position].getName()+"") ;*/return _view;}
//  public static void main(String[] args) {
//      System.out.println(new Date(System.currentTimeMillis()).toString());
//  }
}

至此主活动布局就完成了,主布局效果图:

注意:如果使用模拟器测试,请注意,如果模拟器没有开启 SD 内存iso,请自行开启测试,如果SD内存为空,请自行新建文件测试,谢谢~

Android 编程之入门开发文件夹管理器开发详细讲解-1相关推荐

  1. android 自定义文件夹管理器

    自定义android 文件夹管理器 由于近期项目要求,要客户可以自己选择文件夹路径,试了原生的文件夹管理器太难看了,而且还必须选择文件才行,PS:本人菜鸟,只能找到这样的原生方法,还请大佬勿喷,然后没 ...

  2. android文件夹管理器源码实现,Android文件夹管理器源码实现

    一.资源管理器介绍 现在在一些移动终端上面都会有自带的资源管理器,其实其并非是Android系统自带,而是手机产商与app开发商的合作而导致融合,借助第三方的开发软件预装在出厂的手机,是新时代下的另一 ...

  3. php实现文件夹管理器,php实现文件管理与基础功能操作

    文件的基本操作 先来看一下PHP文件基础操作,请看强大注释 var_dump(filetype("./img/11.png")); //判断返回得是文件还是目录,返回sile为文件 ...

  4. android 遍历sdcard,Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法...

    本文实例讲述了Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法.分享给大家供大家参考,具体如下: private void CopyAssets(String a ...

  5. 优效文件助手-【深度】都2021年了,你还只会用文件夹管理电脑文件?

    一.引言 对于大部分人来说,想要在电脑里快速找到自己想要的文件,并不是一件容易的事.如果你恰好不喜欢整理电脑,当电脑里出现了大量 [新建文件夹1].[新建文件夹2]--时,这时候你要找到某个文件就更加 ...

  6. Android——4.2.2 源代码文件夹结构分析

    近期公司要整android内部培训,分配给我写个培训文档.这里记录例如以下: 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/4089 ...

  7. java邮件附件默认路径_JavaMail - 文件夹管理( Folder Management)

    JavaMail - 文件夹管理( Folder Management) 到目前为止,我们在前面的章节中主要使用了INBOX文件夹. 这是大多数邮件所在的默认文件夹. 有些系统可能将其称为INBOX, ...

  8. Android中项目中各个文件夹的含义和用途详解

    1.src:存放所有的*.java源程序. 2.gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3.assets:可以存放项目一些较大的资源文件,例如:图片. ...

  9. java将邮件保存到本地文件夹_JavaMail 邮件文件夹管理

    到目前为止,我们已经在前面的章节主要介绍收件箱文件夹的工作.这是大多数邮件位于其中的默认文件夹.有些系统可能会调用它的收件箱和其他一些可能被其他一些名字来称呼它.但是,你总是可以从JavaMail A ...

最新文章

  1. 由浅入深解读Redis高级能力及性能调优
  2. php strncmp函数用法,strncmp函数用法详解
  3. 让图片算好高宽再显示
  4. 还找不到数据异常原因?这份教程赶快拿走
  5. 如何将网站数据导入服务器里,网站是无意识的将数据导入和导出Web客户端
  6. fastjson的一些常见用法
  7. 【java基础 12】HashMap中是如何形成环形链表的?
  8. 会Python了不起吗?是的,简直开挂!(文末有福利)
  9. 常用的JS与XML结合用法 简单示例
  10. Android核心 intent基础
  11. mybatis 配置多数据源 java,SpringBoot+MyBatisPlus配置多数据源读写分离
  12. A股数据分析之收集数据:股票列表和股价
  13. 唐朝乐队第三张专辑《浪漫骑士》6月上市.
  14. 大学计算机实践教程在线阅读,第一部分 实验免费阅读_大学计算机基础实践教程免费全文_百度阅读...
  15. NVIC中断优先级管理
  16. 【远程桌面控制】远程控制其软件 对比
  17. openfeign调用异常:feign.FeignException: [405] during [GET]
  18. 误删文件夹但是回收站没有找到怎么恢复?
  19. unc0ver更新适用于iOS14的越狱工具
  20. 快速性心律失常消融手术的增强现实导航系统

热门文章

  1. 单选 性别选项(男,女)提交问题
  2. “当你不再是程序员,很多事会脱离掌控”—— 对话全球最大独立开源公司SUSE CTO
  3. JVM---------------------------JVM
  4. 正数变负数,或者负数变正数最快的方法
  5. Would MediaGo using default-capability.xml?
  6. JSP的优势和劣势 与php的比较
  7. 简单的项目规模统计方法
  8. revit模型怎么在手机上看_BIM查看软件是什么?BIM模型手机查看软件有哪些?
  9. CI130X智能语音芯片应用于空调伴侣,可实现离线语音控制空调,风扇,灯具,电视等,最多支持500条命令词
  10. ChatGPT 大规模封号。。。