第二天. 列出给定文件夹下的指定类型文件

2018-10-27  本文已影响15人  破旧的大卡车

首先, 我们新建一个ListMusic工程. 其具体过程如下:

新建项目

启动Studio, 然后File>New>New Project..., 仿照填写如下列图片所示:

newproj_step1
newproj_step2
newproj_step3
newproj_step4

需要修改的文件

接下来, 来到主界面. 此时我们需要注意如下几个文件, 它们将来需要修改.

各个文件的修改

AndroidManifest.xml的修改

由于我们需要使用读取sd卡, 这是需要授权的. 故在<application>之前加入

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

其他的一些说明可以参考这里, 例如<action android:name="android.intent.action.MAIN" />表明该视图可以启动(呈现出来, 关于多视图的启动在以后会涉及)而<category android:name="android.intent.category.LAUNCHER" />告诉应该将该视图加到启动器.

activity_list_music.xml的修改

首先, 我们将RelativeLayout修改为ScrollView, 这样在文件太多时会显示一个滚动条. 其次, 删除TextView整个block, 因为我们不需要显示"Hello World!", 而是要列出给定目录下的文件名. 最后, 切换到Design模式, 拖入LinearLayout(Vertical)控件. 如图所示:

listmusic_view
这样在切换回text时, 我们发现自动插入了LinearLayout 的block, 将其修改如下:
     <LinearLayout
         android:id="@+id/view"
         android:orientation="vertical"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:padding="8dp"></LinearLayout>

此外, 也建议为ScrollView添加id:android:id="@+id/scrollView".

ListMusicActivity.java的修改

首先, 在onCreate函数的末尾添加新的view:

LinearLayout view = (LinearLayout) findViewById(R.id.view);

接下来, 我们的代码是:

//the root path
        File root = new File (Environment.getExternalStorageDirectory().toString()+"/music");
        File files[]=root.listFiles(new FilenameFilter(){
            @Override
            public boolean accept(File file, String s) {
                return false;
            }
        })

这里的输入需要注意File, FilenameFilter都是类, 需要import这可以直接按Alt+Enter自动添加. 在正确的载入类后, 可以自动补全@Override.
<br />
上述代码中, 第一行是注释, 而第二行的root变量是File类型的, 它的值是SDcard根目录下的music文件夹, 当然这在我真实的手机上的确是有这么个目录, 而且下面放了很多音乐文件. 最后我们使用了listFiles方法来得到每个具体的文件名, 这个方法可以带参数FilenameFilter, 我们接下来将过滤该文件加下的文件名后缀. 具体代码如下:

public boolean accept(File file, String s) {
                return s.toLowerCase().endsWith(".flac")||s.toLowerCase().endsWith(".mp3");
            }

代码的意思很明白, 就是只列出后缀是.flac或者.mp3的文件.
<br />
最后, 我们来讲上述数组files[]显示到view中. 这里我用java的foreach函数. 具体代码如下:

for (File fi: files) {
    TextView textView = new TextView(this);
    textView.setText(fi.getName());
    textView.setPadding(5, 5, 5, 5);
    view.addView(textView);
}

这里的意思也是非常明白的, 在for里面, 我们取出了files数组里的每个元素(文件)fi, 然后新定义了一个变量textView(类型为TextView显示文本), 并设置了属性. 最后用addView将其添加到LinearLayout中的view.

一点注记

为了理解最后一个view.addView(textView);, 首先看view的定义, 它是用LinearLayout view = (LinearLayout) findViewById(R.id.view);可见它是去寻找LinearLayoutidview的元素. 这个元素的确是定义了的:

<LinearLayout
 android:id="@+id/view"
//more code

你可以尝试修改这个id, 然后运行会发现报错.

如何模拟运行

打开Tools>Android>AVD Manager>Create Virtual Device..., 然后参考下图:

listmusic_AVD1
listmusic_AVD2
注意这里选择的兼容版本应该不低于项目开始创建时的最低版本需求. listmusic_AVD3

这里选择Hardware可以加快运行. 点击完成会下载一些东西, 然后就创建好了.
<br />
为了运行上面的app, 我们需要勾选"Enable ADB Integration", 如下图所示:

listmusic_AVD4

最后点击工具栏的那个app后面的play就可以编译并运行了.

listmusic_AVD5

真机测试

真机测试需要开启开发者模式, 并开启USB debugging. 此时在上图中选择对应的设备即可.

最终的文件压缩包

下载

最终的效果图(小米3 TD):

listmusic_result1
上一篇下一篇

猜你喜欢

热点阅读