1. 程式人生 > 實用技巧 >專屬空間第三天——檔案管理器

專屬空間第三天——檔案管理器

  今天是進行開發的第三天了,今天實現的是相當於一個檔案管理器的功能。

  首先先說一下今天學到的東西:今天對昨天學到的東西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>

今天的任務稍微簡單點。