文件选择器
最近在做一个音乐播放器的小实例,其中涉及音乐文件选取。通过窗口模式的Activity来选择添加音乐文件或者文件夹。
menuaddgridview.xml
View Code
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/radiogroup_bg1"
android:padding="5.0dip">
<ImageButton
android:id="@+id/MenuAddGridView_button_openfolder"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10.0dip"
android:src="@drawable/radiogroup_openfolder"
android:adjustViewBounds="true"
android:padding="10.0dip"
android:layout_alignParentLeft="true"/>
<ImageButton
android:id="@+id/MenuAddGridView_button_addSingle"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10.0dip"
android:src="@drawable/radiogroup_addsingle"
android:adjustViewBounds="true"
android:padding="10.0dip"
android:layout_toRightOf="@id/MenuAddGridView_button_openfolder"/>
<ImageButton
android:id="@+id/MenuAddGridView_button_addFolder"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10.0dip"
android:src="@drawable/radiogroup_addfolder"
android:adjustViewBounds="true"
android:padding="10.0dip"
android:layout_toRightOf="@id/MenuAddGridView_button_addSingle"/>
<ImageButton
android:id="@+id/MenuAddGridView_button_backFolder"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="10.0dip"
android:src="@drawable/radiogroup_backfolder"
android:adjustViewBounds="true"
android:padding="10.0dip"
android:layout_alignParentRight="true"/>
</RelativeLayout>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/MenuAddGridView_gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:columnWidth="90dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>
menuaddgridview_item.xml
View Code
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:paddingBottom="4dip" android:layout_width="fill_parent">
<ImageView
android:layout_height="wrap_content"
android:id="@+id/MenuAddGridView_ItemImage"
android:layout_width="wrap_content"
android:layout_centerHorizontal="true">
</ImageView>
<TextView
android:layout_width="wrap_content"
android:layout_below="@id/MenuAddGridView_ItemImage"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:id="@+id/MenuAddGridView_ItemText">
</TextView>
</RelativeLayout>
设置Activity为窗口模式
<activity android:name=".MenuAddGridView" android:theme="@android:style/Theme.Dialog"></activity>
记得要添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
MenuAddGridView的代码:
View Code
public class MenuAddGridView extends Activity {
GridView gridview;
SimpleAdapter gridviewAdapter;
ImageButton openFolder,addSingle,addFolder,backFolder;
String sdcardFilePath,thisFilePath,selectFilePath;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
this.setContentView(R.layout.menuaddgridview);
sdcardFilePath=Environment.getExternalStorageDirectory().getAbsolutePath();//得到sdcard目录
thisFilePath=sdcardFilePath;
openFolder=(ImageButton) this.findViewById(R.id.MenuAddGridView_button_openfolder);
openFolder.setVisibility(View.INVISIBLE);//设置不可见
openFolder.setOnClickListener(new buttonOnClickListener());//添加监听器
addSingle=(ImageButton) this.findViewById(R.id.MenuAddGridView_button_addSingle);
addSingle.setVisibility(View.INVISIBLE);
addSingle.setOnClickListener(new buttonOnClickListener());
addFolder=(ImageButton) this.findViewById(R.id.MenuAddGridView_button_addFolder);
addFolder.setVisibility(View.INVISIBLE);
addFolder.setOnClickListener(new buttonOnClickListener());
backFolder=(ImageButton) this.findViewById(R.id.MenuAddGridView_button_backFolder);
backFolder.setOnClickListener(new buttonOnClickListener());
gridview=(GridView) this.findViewById(R.id.MenuAddGridView_gridview);
//设置gridView的数据
updategridviewAdapter(thisFilePath);
gridview.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
HashMap<String, Object> item=(HashMap<String, Object>) arg0.getItemAtPosition(arg2);
selectFilePath=(String) item.get("ItemFilePath");
if(item.get("type").equals("isDirectory"))//判断是否是文件夹
{
openFolder.setVisibility(View.VISIBLE);//打开文件按钮可见
addSingle.setVisibility(View.INVISIBLE);//选择单曲按钮不可见
addFolder.setVisibility(View.VISIBLE);//选择整个文件夹按钮可见
}
else if(item.get("type").equals("isMp3"))
{
openFolder.setVisibility(View.INVISIBLE);
addSingle.setVisibility(View.VISIBLE);
addFolder.setVisibility(View.INVISIBLE);
}
else
{
openFolder.setVisibility(View.INVISIBLE);
addSingle.setVisibility(View.INVISIBLE);
addFolder.setVisibility(View.INVISIBLE);
}
}});
this.setResult(0);
}
private File[] folderScan(String path)
{
File file=new File(path);
File[] files=file.listFiles();
return files;
}
//设置gridView的数据
private void updategridviewAdapter(String filePath)
{
File[] files=folderScan(filePath);
ArrayList<HashMap<String, Object>> lstImageItem = getFileItems(files);
gridviewAdapter = new SimpleAdapter(MenuAddGridView.this,lstImageItem,R.layout.menuaddgridview_item,new String[] {"ItemImage","ItemText"}, new int[] {R.id.MenuAddGridView_ItemImage,R.id.MenuAddGridView_ItemText});
gridview.setAdapter(gridviewAdapter);
gridviewAdapter.notifyDataSetChanged();
}
//列表循环判断文件类型然后提供数据给Adapter用
private ArrayList<HashMap<String, Object>> getFileItems(File[] files)
{
ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();
//循环加入listImageItem数据
if(files==null)
{
return null;
}
for(int i=0;i<files.length;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
String fileName=files[i].getName();//得到file名
map.put("ItemText", fileName);
if(files[i].isDirectory())//判断是否是文件夹
{
map.put("ItemImage", R.drawable.folder);//显示文件夹图标
map.put("type", "isDirectory");
}
else if(files[i].isFile())//判断是否是文件
{
if(fileName.contains(".mp3"))//判断是否是MP3文件
{
map.put("ItemImage", R.drawable.mp3flie);//加入MP3图标
map.put("type", "isMp3");
}
else
{
map.put("ItemImage", R.drawable.otherfile);//加入非MP3文件图标
map.put("type", "isOthers");
}
}
map.put("ItemFilePath", files[i].getAbsolutePath());//保存文件绝对路径
lstImageItem.add(map);
}
return lstImageItem;
}
private ArrayList<String> getResultArrayList(ArrayList<HashMap<String, Object>> al)
{
ArrayList<String> musicResult=new ArrayList<String>();
for(int i=0;i<al.size();i++)
{
HashMap<String, Object> map=al.get(i);
String type=(String) map.get("type");
String itemFilePath=(String) map.get("ItemFilePath");
if(type.equals("isMp3"))
{
musicResult.add(itemFilePath);
}
}
return musicResult;
}
class buttonOnClickListener implements OnClickListener
{
ArrayList<String> musicResult;
Intent intent;
public void onClick(View v) {
switch(v.getId())
{
case R.id.MenuAddGridView_button_openfolder://打开文件夹
updategridviewAdapter(selectFilePath);//获取文件夹下数据并显示
thisFilePath=selectFilePath;//记录当前目录路径
openFolder.setVisibility(View.INVISIBLE);
addSingle.setVisibility(View.INVISIBLE);
addFolder.setVisibility(View.INVISIBLE);
break;
case R.id.MenuAddGridView_button_addSingle:
musicResult=new ArrayList<String>();
musicResult.add(selectFilePath);
intent=new Intent();
intent.putStringArrayListExtra("musicResult", musicResult);
MenuAddGridView.this.setResult(1, intent);
MenuAddGridView.this.onDestroy();
break;
case R.id.MenuAddGridView_button_addFolder:
//得到文件夹下所有mp3文件
musicResult=getResultArrayList(getFileItems(folderScan(selectFilePath)));
intent=new Intent();
//返回给上一个activity数据
intent.putStringArrayListExtra("musicResult", musicResult);
MenuAddGridView.this.setResult(1, intent);
MenuAddGridView.this.onDestroy();
break;
case R.id.MenuAddGridView_button_backFolder://返回上级目录
if(!thisFilePath.equals(sdcardFilePath))
{
File thisFile=new File(thisFilePath);//得到当前目录
String parentFilePath=thisFile.getParent();//上级的目录路径
updategridviewAdapter(parentFilePath);//获得上级目录数据并显示
thisFilePath=parentFilePath;//设置当前目录路径
openFolder.setVisibility(View.INVISIBLE);
addSingle.setVisibility(View.INVISIBLE);
addFolder.setVisibility(View.INVISIBLE);
}
else
{
MenuAddGridView.this.onDestroy();
}
break;
}
}
}
protected void onDestroy() {
this.finish();
super.onDestroy();
}
}
效果图: