專屬空間第三天——檔案管理器
阿新 • • 發佈:2020-07-18
今天是進行開發的第三天了,今天實現的是相當於一個檔案管理器的功能。
首先先說一下今天學到的東西:今天對昨天學到的東西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>
今天的任務稍微簡單點。