Android 简单实现SD卡文件管理器功能

阿木木 阿木木 | 118 | 2022-12-28

项目中需要用到一个简单的文件选择器,来选择SD卡里的文件,做一个简单的DEMO功能实现。

dfac047e72e741fcaef5b5b78c369e14

写的比较粗糙,资源图片就不上传了,屏蔽掉即可!很简单的东西没什么技术含量,以后再继续优化吧!

功能
点击文件夹进入该文件夹下的目录并列出文件
非文件夹可直接选择选取该文件

Activity


package com.yh.fireworks.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.yh.fireworks.R;
import com.yh.fireworks.base.BaseActivity;
import com.yh.fireworks.model.FileDataInfo;
import com.yh.fireworks.ui.adapter.FolderManageAdapter;
import com.yh.fireworks.utils.StringUtils;
import com.yh.fireworks.utils.ToastUtils;
import com.yh.fireworks.validate.util.StringUtil;
import com.yh.fireworks.widget.WrapContentLinearLayoutManager;

import java.io.File;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;


/**
 * @enterprise
 * @Author Baocheng.Zhang
 * @Date 2021/6/6
 * @Version 1.0
 * @Description 文件夹管理器
 */
public class FolderManageActivity extends BaseActivity implements View.OnClickListener {
    TextView titleNameTV;
    ImageView backIV;
    TextView statusBarHeightTV;
    RecyclerView recyclerview;
    //下拉刷新
    TextView nullDataTV;


    TextView selectAllTV;
    TextView deleteTV;
    RelativeLayout bottomRL;

    private TextView catalogueTV;
    private TextView returnTV;//返回上一级


    private LinearLayoutManager layoutManager;
    private FolderManageAdapter fileManageAdapter;
    private List<FileDataInfo> fileList = new ArrayList<>();//文档列表

    private String filePath = "";//当前进入的文件目录
    private List<String> filePathList;//文件路径List


    @Override
    public int getLayoutId() {
        return R.layout.activity_folder_manage;
    }

    @Override
    public int getAppBarColor() {
        return 0;

    }

    @Override
    protected void initViewData(Bundle savedInstanceState) {


        deleteTV = (TextView) this.findViewById(R.id.delete_tv);
        deleteTV.setOnClickListener(this);

        selectAllTV = (TextView) this.findViewById(R.id.toolbar_right_tv);
        selectAllTV.setText("全选");
        selectAllTV.setOnClickListener(this);
        selectAllTV.setTag("");

        bottomRL = (RelativeLayout) this.findViewById(R.id.bottom_rl);

        nullDataTV = (TextView) this.findViewById(R.id.null_data_tv);

        catalogueTV = (TextView) this.findViewById(R.id.catalogue_tv);
        returnTV = (TextView) this.findViewById(R.id.return_tv);
        returnTV.setOnClickListener(this);

        recyclerview = (RecyclerView) this.findViewById(R.id.recyclerview);
        titleNameTV = (TextView) this.findViewById(R.id.title_name_tv);
        backIV = (ImageView) this.findViewById(R.id.back_iv);
        statusBarHeightTV = (TextView) this.findViewById(R.id.status_bar_height_tv);
        titleNameTV.setText("文件管理");
        statusBarHeightTV.setVisibility(View.VISIBLE);
        statusBarHeightTV.setHeight(getStatusBarHeight());
        backIV.setVisibility(View.VISIBLE);
        backIV.setOnClickListener(this);
        filePathList = new ArrayList<>();

        //搜的是根目录
        File rootSdkFile = Environment.getExternalStorageDirectory();
        filePathList.add(rootSdkFile.getPath());//把根目录加进去
        //list 布局
        initRecycler();
        //获取数据
        getData();
    }


    private void initRecycler() {

        //初始化布局控件
        layoutManager = new WrapContentLinearLayoutManager(mActivity, LinearLayoutManager.VERTICAL, false);
        recyclerview.setLayoutManager(layoutManager);
        fileManageAdapter = new FolderManageAdapter(mActivity, fileList);
        fileManageAdapter.setOnClickLinster(new FolderManageAdapter.onClickLinster() {
            @Override
            public void itemClick(View view, int position, List<FileDataInfo> adapterList) {
                switch (view.getId()) {
                    case R.id.right_cb_rl:
                    case R.id.ck_iv:
                        //显示全选
                        //selectAllTV.setVisibility(View.VISIBLE);
                        //多选
                        if (adapterList.get(position).isSelect()) {
                            fileList.get(position).setSelect(false);
                        } else {
                            fileList.get(position).setSelect(true);
                        }
                        int count = 0;
                        for (int i = 0; i < fileList.size(); i++) {
                            if (fileList.get(i).isSelect()) {
                                count = count + 1;
                                break;
                            }
                        }
                        if (count > 0) {
                            bottomRL.setVisibility(View.VISIBLE);
                        } else {
                            bottomRL.setVisibility(View.GONE);
                        }
                        fileManageAdapter.notifyDataSetChanged();
                        break;
                    case R.id.file_content_ll:
                        //如果是文件则进行预览
                        //如果是文件夹则进入到文件夹目录下
                        FileDataInfo fileDataInfo = fileList.get(position);

                        if (fileDataInfo.isFolder()) {
                            //文件夹 进入到该文件夹下
                            filePath = fileDataInfo.getFilePath();
                            filePathList.add(filePath);//把路径放进去
                            getData();
                        } else {
                            //文件 点击后预览
                            if ("word".equals(fileDataInfo.getFileType()) ||
                                    "pdf".equals(fileDataInfo.getFileType()) ||
                                    "ppt".equals(fileDataInfo.getFileType()) ||
                                    "excel".equals(fileDataInfo.getFileType())) {
                                String filePath = fileList.get(position).getFilePath();
                                String fileName = fileList.get(position).getFileName();
                                Intent intent = new Intent(mActivity, TbsReadActivity.class);
                                intent.putExtra("filePath", filePath);
                                intent.putExtra("fileName", fileName);
                                startActivity(intent);

                            } else if ("mp4".equals(fileDataInfo.getFileType())) {
                                Intent intent = new Intent(mActivity, VideoPreviewActivity.class);
                                intent.putExtra("videoType", "1");
                                intent.putExtra("videoUrl", "file:///" + fileDataInfo.getFilePath() + "/" + fileDataInfo.getFileName() + "");
                                intent.putExtra("startPlay", "true");
                                startActivity(intent);
                            } else if ("png".equals(fileDataInfo.getFileType())) {
                                List<String> imgList = new ArrayList<String>();
                                imgList.add("file:///" + fileDataInfo.getFilePath() + "/" + fileDataInfo.getFileName());
                                Intent intent = new Intent(mActivity, ImgPreviewActivity.class);
                                intent.putExtra("imglist", (Serializable) imgList);
                                intent.putExtra("position", 0);
                                startActivity(intent);
                            } else {
                                ToastUtils.showToast(mContext, "暂不支持此类型文件预览");
                            }
                        }
                        break;
                    default:
                        break;
                }

            }
        });
        recyclerview.setAdapter(fileManageAdapter);

    }

    /**
     * 加载数据
     */
    private void getData() {
        fileList.clear();
        //获取文件
        getSDKFiles();
        if (fileList.size() == 0) {
            nullDataTV.setVisibility(View.VISIBLE);
            recyclerview.setVisibility(View.GONE);
            fileManageAdapter.notifyDataSetChanged();
        } else if (fileList != null && fileList.size() > 0) {
            nullDataTV.setVisibility(View.GONE);
            recyclerview.setVisibility(View.VISIBLE);
            fileManageAdapter.notifyDataSetChanged();
        }
    }


    /**
     * 获取SDK路径
     */
    private void getSDKFiles() {
        fileList.clear();
        File sdkFile;
        File[] sdkFileList;
        if (StringUtil.isEmpty(filePath)) {
            //搜的是根目录
            sdkFile = Environment.getExternalStorageDirectory();
            sdkFileList = sdkFile.listFiles();
            catalogueTV.setText(sdkFile.getPath());
        } else {
            sdkFile = new File(filePath);
            sdkFileList = sdkFile.listFiles();
            catalogueTV.setText(filePath);
        }
        if (sdkFileList == null) {
            return;
        }

        FileDataInfo fileInfo;
        for (int i = 0; i < sdkFileList.length; i++) {
            Log.i("文件名", sdkFileList[i].getName() + "");

            String fileName = sdkFileList[i].getName() + "";
            if (!StringUtils.isEmpty(fileName)) {

                fileInfo = new FileDataInfo();

                //设置文名
                fileInfo.setFileName(fileName);
                //设置文件路径
                fileInfo.setFilePath((sdkFileList[i].getPath()));
                //设置文件大小
                //fileInfo.setFileSize(FileSizeUtil.getAutoFileOrFilesSize(fileInfo.getFilePath() + "/" + fileName));
                //设置文件创建实践
                fileInfo.setFileTime(getFileLastModifiedTime(new File(sdkFileList[i].getPath())));


                //判断是否是文件夹
                File file = new File(sdkFileList[i].getPath());

                if (file.exists()) {
                    fileInfo.setFolder(file.isDirectory());
                } else {
                    fileInfo.setFolder(false);
                }

                if (!fileInfo.isFolder()) {
                    //不是文件夹 筛选word ex ppt xls jpg mp4 等文件
                    String[] nameSplit = fileName.split("\\.");
                    Log.i("showFileNumber", nameSplit.length + "");
                    if (nameSplit.length >= 2) {
                        //fileInfo.setFile(file);
                        fileInfo.setSuffix(nameSplit[1]);
                        //根据后缀类型筛选
                        if ("doc".equals(nameSplit[nameSplit.length - 1]) || "docx".equals(nameSplit[nameSplit.length - 1])) {
                            fileInfo.setFileType("word");
                        } else if ("ppt".equals(nameSplit[nameSplit.length - 1])) {
                            fileInfo.setFileType("ppt");
                        } else if ("xls".equals(nameSplit[nameSplit.length - 1]) || "xlsx".equals(nameSplit[nameSplit.length - 1])) {
                            fileInfo.setFileType("excel");
                        } else if ("pdf".equals(nameSplit[nameSplit.length - 1])) {
                            fileInfo.setFileType("pdf");
                        } else if ("jpg".equals(nameSplit[nameSplit.length - 1]) || "png".equals(nameSplit[nameSplit.length - 1])) {
                            fileInfo.setFileType("png");
                        } else if ("mp4".equals(nameSplit[nameSplit.length - 1])) {
                            fileInfo.setFileType("mp4");
                        } else if ("zip".equals(nameSplit[nameSplit.length - 1]) || "rar".equals(nameSplit[nameSplit.length - 1])) {
                            fileInfo.setFileType("zip");
                        } else {
                            fileInfo.setFileType("other");
                        }
                        fileList.add(fileInfo);
                    }
                } else {
                    //是文件夹
                    fileList.add(fileInfo);
                }
            }
        }
        Log.i("文件总数", fileList.size() + "");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.back_iv:
                finish();
                break;

            case R.id.return_tv:


                if (filePathList.size() >= 2) {
                    String dqFilePath = filePathList.get(filePathList.size() - 1);//当前目录
                    String lastFilePath = filePathList.get(filePathList.size() - 1 - 1);//上一个目录

                    Log.i("文件", "当前目录" + dqFilePath);
                    Log.i("文件", "上一个文件目录" + lastFilePath);

                    filePath = lastFilePath;
                    getData();
                    //把最后一个删除
                    filePathList.remove(filePathList.size() - 1);
                }
                break;
            case R.id.toolbar_right_tv:
                //全选
                if (StringUtils.isEmpty((String) selectAllTV.getTag())) {
                    //先前没有点 点击是全选
                    for (int i = 0; i < fileList.size(); i++) {
                        fileList.get(i).setSelect(true);
                    }
                    selectAllTV.setTag("all");
                } else {
                    if ("all".equals(selectAllTV.getTag())) {
                        //取消
                        for (int i = 0; i < fileList.size(); i++) {
                            fileList.get(i).setSelect(false);
                        }
                        fileManageAdapter.notifyDataSetChanged();
                        selectAllTV.setTag("delete");
                        selectAllTV.setText("取消");
                    } else if ("delete".equals(selectAllTV.getTag())) {
                        //添加
                        for (int i = 0; i < fileList.size(); i++) {
                            fileList.get(i).setSelect(true);
                        }
                        fileManageAdapter.notifyDataSetChanged();
                        selectAllTV.setTag("all");
                        selectAllTV.setText("全选");
                    }
                }
                break;
            default:
                break;
        }
    }

    private static final String mformatType = "yyyy-MM-dd HH:mm:ss";

    public static String getFileLastModifiedTime(File file) {
        Calendar cal = Calendar.getInstance();
        long time = file.lastModified();
        SimpleDateFormat formatter = new SimpleDateFormat(mformatType);
        cal.setTimeInMillis(time);

        // 输出:修改时间[2] 2009-08-17 10:32:38
        return formatter.format(cal.getTime());
    }
}

activity layout布局


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_activity_bg_color"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include
            android:id="@+id/top_tb"
            layout="@layout/toolbar_activity" />


        <LinearLayout
            android:id="@+id/action_ll"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/top_tb"
            android:orientation="vertical">


            <TextView
                android:id="@+id/catalogue_tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="根目录" />


            <TextView
                android:id="@+id/return_tv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="返回上一层" />


        </LinearLayout>


        <com.scwang.smartrefresh.layout.SmartRefreshLayout
            android:id="@+id/rf_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/action_ll">

            <com.scwang.smartrefresh.layout.header.ClassicsHeader
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:srlDrawableArrow="@drawable/arrow_up" />

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


                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recyclerview"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:visibility="gone" />

                <TextView
                    android:id="@+id/null_data_tv"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_centerVertical="true"
                    android:drawableTop="@drawable/bg_null_data"
                    android:drawablePadding="10dp"
                    android:gravity="center"
                    android:text="暂无文件"
                    android:textColor="#999999"
                    android:textSize="12sp"
                    android:visibility="gone" />


            </RelativeLayout>


            <com.scwang.smartrefresh.layout.footer.ClassicsFooter
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </com.scwang.smartrefresh.layout.SmartRefreshLayout>


        <RelativeLayout
            android:id="@+id/bottom_rl"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/rf_layout"
            android:layout_alignParentBottom="true"
            android:background="#ff0c7afc"
            android:padding="10dp"
            android:visibility="gone">


            <TextView
                android:id="@+id/delete_tv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginStart="15dp"
                android:layout_marginLeft="15dp"
                android:layout_marginEnd="15dp"
                android:layout_marginRight="15dp"
                android:drawableTop="@drawable/icon_file_delete"
                android:gravity="center_horizontal|center_vertical"
                android:padding="10dp"
                android:text="发送"
                android:textColor="@color/white"
                android:textSize="12sp" />

        </RelativeLayout>

    </RelativeLayout>


</FrameLayout>

Adapter

public class FolderManageAdapter extends RecyclerView.Adapter<FolderManageAdapter.ViewHolder> {
    private Context context;
    private List<FileDataInfo> list;

    public FolderManageAdapter(Context context, List<FileDataInfo> list) {
        this.context = context;
        this.list = list;

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_folder_manage, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        FileDataInfo fileInfo = list.get(position);


        if(fileInfo.isFolder()){
            //文件夹
            holder.logoIV.setImageResource(R.drawable.file_manage_wj);
            holder.ckIV.setVisibility(View.INVISIBLE);//隐藏选中
        }else{
            //文件放开选中
            holder.ckIV.setVisibility(View.VISIBLE);


            if ("word".endsWith(fileInfo.getFileType())) {
                holder.logoIV.setImageResource(R.drawable.icon_file_word);
            } else if ("pdf".endsWith(fileInfo.getFileType())) {
                holder.logoIV.setImageResource(R.drawable.icon_file_pdf);
            } else if ("ppt".endsWith(fileInfo.getFileType())) {
                holder.logoIV.setImageResource(R.drawable.icon_file_ppt);
            } else if ("excel".endsWith(fileInfo.getFileType())) {
                holder.logoIV.setImageResource(R.drawable.icon_file_excel);
            } else if ("zip".equals(fileInfo.getFileType())) {
                holder.logoIV.setImageResource(R.drawable.icon_file_ysb);
            } else if ("png".equals(fileInfo.getFileType())) {
                //获取本地图片展示
                Glide.with(context).load(fileInfo.getFilePath() + "/" + fileInfo.getFileName())
                        .apply(new RequestOptions()
                                .transforms(new CenterCrop(), new RoundedCorners(10)
                                ))
                        .into(holder.logoIV);

            } else if ("mp4".equals(fileInfo.getFileType())) {
                //获取mp4第一帧展示
                Glide.with(context).load(fileInfo.getFilePath() + "/" + fileInfo.getFileName())
                        .apply(new RequestOptions()
                                .transforms(new CenterCrop(), new RoundedCorners(10)
                                ))
                        .into(holder.logoIV);

            } else {
                holder.logoIV.setImageResource(R.drawable.icon_file_qt);
            }
        }



        ViewGroup.LayoutParams lp = holder.ckIV.getLayoutParams();

        if (list.get(position).isSelect()) {
            holder.ckIV.setBackground(context.getDrawable(R.drawable.icon_file_ok));
            int max = DensityUtil.dp2px(context, 24);
            lp.width = max;
            lp.height = max;
        } else {
            int mini = DensityUtil.dp2px(context, 14);
            holder.ckIV.setBackground(context.getDrawable(R.drawable.icon_file_no));
            lp.width = mini;
            lp.height = mini;
        }
        holder.ckIV.setLayoutParams(lp);


        holder.titleTV.setText(list.get(position).getFileName() + "");
        holder.timeTV.setText(list.get(position).getFileTime() + "");
        holder.sizeTV.setText(list.get(position).getFileSize() + "");
        holder.ckIV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                linster.itemClick(view, position, list);
            }
        });

        holder.rightCbRL.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                linster.itemClick(v, position, list);
            }
        });

        holder.fileContentLL.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                linster.itemClick(v, position, list);
            }
        });
    }


    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        private final LinearLayout fileContentLL;
        private final TextView titleTV;
        private final TextView timeTV;
        private final TextView sizeTV;
        private final ImageView logoIV;
        private final ImageView ckIV;
        private final RelativeLayout rightCbRL;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            fileContentLL = ((LinearLayout) itemView.findViewById(R.id.file_content_ll));
            titleTV = ((TextView) itemView.findViewById(R.id.title_tv));
            timeTV = ((TextView) itemView.findViewById(R.id.time_tv));
            sizeTV = ((TextView) itemView.findViewById(R.id.size_tv));
            logoIV = ((ImageView) itemView.findViewById(R.id.logo_iv));
            ckIV = ((ImageView) itemView.findViewById(R.id.ck_iv));
            rightCbRL = ((RelativeLayout) itemView.findViewById(R.id.right_cb_rl));


        }
    }

    onClickLinster linster;

    public void setOnClickLinster(onClickLinster linster) {
        this.linster = linster;
    }

    public interface onClickLinster {
        void itemClick(View view, int position, List<FileDataInfo> titles);
    }
}

item layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipeMenuLayout_sm"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:orientation="vertical">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <ImageView
            android:id="@+id/logo_iv"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginStart="10dp"
            android:layout_marginEnd="10dp" />


        <LinearLayout
            android:id="@+id/file_content_ll"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@+id/right_cb_rl"
            android:layout_toRightOf="@+id/logo_iv"
            android:orientation="vertical"
            android:padding="10dp"
            android:layout_toStartOf="@+id/right_cb_rl"
            android:layout_toEndOf="@+id/logo_iv">

            <TextView
                android:id="@+id/title_tv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:maxLines="2"
                android:textColor="#333333"
                android:textSize="16sp" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp">

                <TextView
                    android:id="@+id/time_tv"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:textColor="#999999"
                    android:textSize="14sp"
                    android:layout_alignParentStart="true" />

                <TextView
                    android:id="@+id/size_tv"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_toRightOf="@+id/time_tv"
                    android:textColor="#999999"
                    android:textSize="14sp"
                    android:layout_toEndOf="@+id/time_tv"
                    android:layout_marginStart="10dp" />


            </RelativeLayout>


        </LinearLayout>

        <RelativeLayout
            android:id="@+id/right_cb_rl"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_alignParentEnd="true">

            <ImageView
                android:id="@+id/ck_iv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:background="@drawable/icon_file_no"
                android:padding="10dp" />


        </RelativeLayout>


    </RelativeLayout>

</LinearLayout>
文章标签: Android
推荐指数:

真诚点赞 诚不我欺~

Android 简单实现SD卡文件管理器功能

点赞 收藏 评论