专属空间三——文件管理器
今天是进行开发的第三天了,今天实现的是相当于一个文件管理器的功能。
首先先说一下今天学到的东西:今天对昨天学到的东西ListView进行了应用,Adapter再一次的深加工。
以及有如何获取SD卡的内容方法和权限的写法(这个要注意,要不然功能无法实现)
主要是通过获取SD卡的内容加载到Map中,然后再加上适配器呈现在listView,其中要注意父目录和子目录的逻辑顺序,程序其实也就是相当于使用了递归的写法。 然后在上面加上了当前目录的位置,绝对路径。接着是在页面下写了一个Imagebutton,根据父子目录的递归带哦用跳转界面,也就是文件夹(判断当前目录是否为SD卡的根目录,如果是直接退出ACTIVITY如果不是,就获取当前文件的父目录,然后重新加载ListView文件)。
下面是FileExplorer.java和对应的xml文件
package com.example.personspace.FileExplorer; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.AdapterView; import android.widget.ImageButton; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import com.example.personspace.MainActivity; import com.example.personspace.R; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class FileExplorerActivity extends AppCompatActivity { TextView pathTv; ImageButton backBtn; ListView fileLv; File currentParent; File[] currenFiles; File root; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file_explorer); pathTv=findViewById(R.id.id_filepath); backBtn=findViewById(R.id.id_btn_back); fileLv=findViewById(R.id.id_lv_file); //判断手机是否装载了SD卡 boolean isLoadSDCard= Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); if (isLoadSDCard){ //获取SD卡的根目录 root=Environment.getExternalStorageDirectory(); currentParent =root; //获取当前文件夹下所有的文件; currenFiles=currentParent.listFiles(); inflateListView(currenFiles); }else{ Toast.makeText(this,"SD卡没有被装载",Toast.LENGTH_SHORT).show(); } // 设置监听事件 setListener(); } private void setListener() { fileLv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (currenFiles[position].isFile()){ Toast.makeText(FileExplorerActivity.this,"无法打开此文件,正在完善中",Toast.LENGTH_SHORT).show(); return; } File[] temp=currenFiles[position].listFiles(); if (temp==null||temp.length==0){ Toast.makeText(FileExplorerActivity.this,"当前文件夹没有内容或者不能被访问",Toast.LENGTH_SHORT).show(); }else{ //修改被点击这项的父目录 currentParent=currenFiles[position]; currenFiles=temp; //数据源发生改变,重新设置适配器内容 inflateListView(currenFiles); } } }); backBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //判断当前的目录是否为SD卡的根目录,如果是直接退出activity //如果不是根目录,就获取当前文件的父目录,然后重新加载listView文件 if (currentParent.getAbsolutePath().equals(root.getAbsolutePath())){ Intent intent=new Intent(FileExplorerActivity.this, MainActivity.class); startActivity(intent); }else{ currentParent=currentParent.getParentFile(); currenFiles=currentParent.listFiles(); inflateListView(currenFiles); } } }); } private void inflateListView(File[] currenFiles) { List<Map<String,Object>> list=new ArrayList<>(); for (int i=0;i<currenFiles.length;i++){ Map<String,Object> map=new HashMap<>(); map.put("filename",currenFiles[i].getName()); if (currenFiles[i].isFile()){ map.put("icon",R.mipmap.file); }else { map.put("icon",R.mipmap.folder); } list.add(map); } //创建适配器 SimpleAdapter adapter=new SimpleAdapter(this,list,R.layout.item_file_explorer,new String[]{"filename","icon"},new int[]{R.id.item_tv,R.id.item_laicon}); fileLv.setAdapter(adapter); pathTv.setText("当前路径:"+currentParent.getAbsolutePath()); } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/id_filepath" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="文件路劲:/mnt/sdcard" /> <ImageButton android:id="@+id/id_btn_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/back1" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"/> <ListView android:id="@+id/id_lv_file" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/id_filepath" android:layout_above="@id/id_btn_back" android:divider="#000" android:dividerHeight="1dp"/> </RelativeLayout>
接下来是一个item_file_explorer.xml布局
<?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:padding="5dp"> <ImageView android:id="@+id/item_laicon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/folder"/> <TextView android:id="@+id/item_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="35sp" android:layout_marginLeft="20dp" android:text="112222"/> </LinearLayout>
今天的任务稍微简单点。