第二天. 列出给定文件夹下的指定类型文件
首先, 我们新建一个ListMusic
工程. 其具体过程如下:
新建项目
启动Studio, 然后File>New>New Project...
, 仿照填写如下列图片所示:
newproj_step2
newproj_step3
newproj_step4
需要修改的文件
接下来, 来到主界面. 此时我们需要注意如下几个文件, 它们将来需要修改.
-
AndroidManifest.xml
: 俗称为文件清单, 它大致规定了这个app需要用到的文件. -
activity_list_music.xml
: 视图文件, 这个就是相当于一个web页面, 用来放下面的ListMusicActivity.java
输出的东西. -
ListMusicActivity.java
: 这个就是核心的功能文件, 规定了视图的具体内容.
各个文件的位置如下图所示:
proj_main_views
各个文件的修改
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)
控件. 如图所示:
这样在切换回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);
可见它是去寻找LinearLayout
下id为view
的元素. 这个元素的确是定义了的:
<LinearLayout
android:id="@+id/view"
//more code
你可以尝试修改这个id
, 然后运行会发现报错.
如何模拟运行
打开Tools>Android>AVD Manager>Create Virtual Device...
, 然后参考下图:
listmusic_AVD2
注意这里选择的兼容版本应该不低于项目开始创建时的最低版本需求. listmusic_AVD3
这里选择Hardware可以加快运行. 点击完成会下载一些东西, 然后就创建好了.
<br />
为了运行上面的app, 我们需要勾选"Enable ADB Integration", 如下图所示:
最后点击工具栏的那个app后面的play就可以编译并运行了.
listmusic_AVD5真机测试
真机测试需要开启开发者模式, 并开启USB debugging. 此时在上图中选择对应的设备即可.