Android文件目录选择器(可自行扩展)

上一篇中写了文件下载的博文,其中说道要用户选择文件的保存目录,在此展示:

首先看FileBrowserActivity.java

package com.knowhow.android.client;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.knowhow.android.client.ui.adapter.FileAdapter;

public class FileBrowserActivity extends KHActivity {

	private List<String> items=null;
	private List<String> paths=null;
	private String rootPath="/sdcard/";
	private TextView mPath;
	private ListView list;  
	private FileAdapter m_FileAdapter;
	private void getFileDir(String filePath){

		File f=new File(filePath); 
		if(f.exists() && f.canWrite()){
			mPath.setText(filePath);
			items=new ArrayList<String>();
			paths=new ArrayList<String>();
			File[] files=f.listFiles();
			if(!filePath.equals(rootPath)){
				items.add("goroot");
				paths.add(rootPath);
				items.add("goparent");
				paths.add(f.getParent());
			}
			for(int i=0;i<files.length;i++){
				File file=files[i];
				if(file.isDirectory()){
					items.add(file.getName());
					paths.add(file.getPath());
				}
			}
			m_FileAdapter = new FileAdapter(this,items,paths);
			list.setAdapter(m_FileAdapter);
			list.setOnItemClickListener(new OnItemClickListener(){
				
				@Override
				public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
					
					if(items.get(position).toString().equals("goparent")){
						getFileDir(paths.get(position));
					}else if(items.get(position).toString().equals("goroot")){
						getFileDir(paths.get(position));
						return;
					}else{
						File file=new File(paths.get(position));
						if(file.canWrite()){
							if (file.isDirectory()){
								getFileDir(paths.get(position));
							}
						}else{
							LinearLayout lay = new LinearLayout(FileBrowserActivity.this);
							lay.setOrientation(LinearLayout.HORIZONTAL);
							ImageView image = new ImageView(FileBrowserActivity.this);
							TextView text = new TextView(FileBrowserActivity.this);
							text.setTextColor(Color.RED);
							text.setTextSize(20);
							text.setText("很抱歉您的权限不足!");
							Toast toast = Toast.makeText(FileBrowserActivity.this, text.getText().toString(), Toast.LENGTH_LONG);
							image.setImageResource(android.R.drawable.stat_sys_warning);
							lay.addView(image);
							lay.addView(text);
							toast.setView(lay);
							toast.show();
						}
					}
				}
			});
		}else{
			LinearLayout lay = new LinearLayout(FileBrowserActivity.this);
			lay.setOrientation(LinearLayout.HORIZONTAL);
			ImageView image = new ImageView(FileBrowserActivity.this);
			TextView text = new TextView(FileBrowserActivity.this);
			text.setTextColor(Color.RED);
			text.setTextSize(20);
			text.setText("无SD卡,无法完成下载!");
			Toast toast = Toast.makeText(FileBrowserActivity.this, text.getText().toString(), Toast.LENGTH_LONG);
			image.setImageResource(android.R.drawable.stat_sys_warning);
			lay.addView(image);
			lay.addView(text);
			toast.setView(lay);
			toast.show();
			this.finish();
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.filelist);
		mPath = (TextView)this.findViewById(R.id.mPath);
		list = (ListView)this.findViewById(R.id.filelist);
		getFileDir(rootPath);
		mPath.setTextColor(this.getResources().getColor(R.color.text_color));
		this.setTitle("请选择保存目录:");
		Button ok = (Button)this.findViewById(R.id.fileok);
		ok.setPadding(0, 5, 0, 5);
		ok.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				/*if(mPath.getText().toString().equals(rootPath)){
					LinearLayout lay = new LinearLayout(FileBrowserActivity.this);
					lay.setOrientation(LinearLayout.HORIZONTAL);
					ImageView image = new ImageView(FileBrowserActivity.this);
					TextView text = new TextView(FileBrowserActivity.this);
					text.setTextColor(FileBrowserActivity.this.getResources().getColor(R.color.text_color));
					text.setTextSize(16);
					text.setText("很抱歉您的权限不足!");
					Toast toast = Toast.makeText(FileBrowserActivity.this, text.getText().toString(), Toast.LENGTH_SHORT);
					image.setImageResource(android.R.drawable.stat_sys_warning);
					lay.addView(image);
					lay.addView(text);
					toast.setView(lay);
					toast.show();
				}else{*/
					Intent i = new Intent();
					Bundle b = new Bundle();  
					b.putString("savePath", mPath.getText().toString());  
					b.putString("url", FileBrowserActivity.this.getIntent().getStringExtra("url"));  
					b.putString("fileName", FileBrowserActivity.this.getIntent().getStringExtra("fileName"));  
					i.putExtras(b);
					FileBrowserActivity.this.setResult(RESULT_OK, i);
					FileBrowserActivity.this.finish();
				//}
				
			}
		});
		Button cancel = (Button)this.findViewById(R.id.filecancel);
		cancel.setPadding(0, 5, 0, 5);
		cancel.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				FileBrowserActivity.this.finish();
			}
		});
	}
}
接下来看listview的layout文件以及FileAdapter.java

filelist.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	android:orientation="vertical" android:background="@drawable/white">
	<LinearLayout android:layout_width="fill_parent" android:gravity="center"
		android:layout_height="wrap_content" android:orientation="horizontal">
		<Button android:layout_weight="1.0" android:textColor="@color/button_text_color"
			android:textSize="16dip" android:background="@drawable/bg_alibuybutton_states"
			android:layout_height="wrap_content" android:layout_width="wrap_content"
			android:id="@+id/fileok"
			android:text="确定" />
		<Button android:layout_marginLeft="10dip"
			android:layout_weight="1.0" android:textColor="@color/button_text_color"
			android:textSize="16dip" android:background="@drawable/bg_alibuybutton_states"
			android:layout_height="wrap_content" android:layout_width="wrap_content"
			android:id="@+id/filecancel" 
			android:text="取消"></Button>
	</LinearLayout>
	<TextView android:id="@+id/mPath" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:padding="5px"
		android:textSize="18sp" android:textColor="@drawable/blue" />
	<ListView android:id="@+id/filelist" android:layout_width="wrap_content"
	    android:cacheColorHint="#00000000"
		android:layout_height="wrap_content" />
</LinearLayout>

file_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/file_items"
	android:layout_width="fill_parent" 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_height="wrap_content" 
	android:paddingBottom="4dip"
	android:paddingLeft="12dip" 
	android:paddingRight="12dip">
  <ImageView android:id="@+id/fileicon"
    android:layout_height="wrap_content"
	android:textSize="26dip"
	android:layout_alignParentLeft="true"
	android:layout_width="wrap_content"
	android:layout_below="@+id/file_items"/>
  <TextView android:id="@+id/filetext"
    android:layout_gravity="center_vertical"
    android:layout_width="fill_parent"
    android:layout_toRightOf="@id/fileicon"
    android:paddingLeft="20dip"
    android:layout_height="wrap_content"/>
  <CheckBox android:id="@+id/file_check" 
	    style="?android:attr/starStyle"
		android:layout_height="wrap_content" 
		android:layout_width="wrap_content" 
		android:layout_alignParentRight="true"
		android:focusable="false"   
        android:focusableInTouchMode="false"   
        android:clickable="false"
		android:layout_below="@+id/file_items"/>
</RelativeLayout>

FileAdapter.java

package com.knowhow.android.client.ui.adapter;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.knowhow.android.client.R;

public class FileAdapter extends BaseAdapter{

	private LayoutInflater mInflater;
	private Bitmap mIcon1;
	private Bitmap mIcon2;
	private Bitmap mIcon3;
	private Bitmap mIcon4;
	private List<String> items;
	private List<String> paths;
	private Map<Integer, Boolean> isSelected;
	private Map<Integer, Integer> isVisibility;
	public Map<Integer, Integer> getIsVisibility() {
		return isVisibility;
	}

	private List<ViewHolder> VHs = new ArrayList<ViewHolder>();
	private Context context;

	public Map<Integer, Boolean> getIsSelected() {
		return isSelected;
	}

	public void setIsSelected(Map<Integer, Boolean> isSelected) {
		this.isSelected = isSelected;
	}

	public FileAdapter(Context context,List<String> it,List<String> pa){
		
		this.context = context;
		mInflater = LayoutInflater.from(context);
		if( it != null && it.size() > 0){
			isSelected = new HashMap<Integer, Boolean>();
			isVisibility = new HashMap<Integer, Integer>();
			for (int i = 0; i < it.size(); i++) {    
				isSelected.put(i, false);
				isVisibility.put(i, View.GONE);
			}
		}
		items = it;
		paths = pa;
		mIcon1 = BitmapFactory.decodeResource(context.getResources(),
				R.drawable.backroot);
		mIcon2 = BitmapFactory.decodeResource(context.getResources(),
				R.drawable.backparent);
		mIcon3 = BitmapFactory.decodeResource(context.getResources(),
				R.drawable.folder);
		mIcon4 = BitmapFactory.decodeResource(context.getResources(),
				R.drawable.doc);
	}

	@Override
	public int getCount(){
		return items.size();
	}

	@Override
	public Object getItem(int position){
		return items.get(position);
	}

	@Override
	public long getItemId(int position){
		return position;
	}

	@Override
	public View getView(int position,View convertView,ViewGroup parent){
		ViewHolder holder;

		if(convertView == null){
			convertView = mInflater.inflate(R.layout.file_row, null);
			holder = new ViewHolder();
			VHs.add(holder);
			holder.text = (TextView) convertView.findViewById(R.id.filetext);
			holder.text.setTextColor(context.getResources().getColor(R.color.text_color));
			holder.icon = (ImageView) convertView.findViewById(R.id.fileicon);
			holder.cBox = (CheckBox) convertView.findViewById(R.id.file_check);
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder) convertView.getTag();
		}
		File f=new File(paths.get(position).toString());
		if(items.get(position).toString().equals("goroot")){
			holder.text.setText("返回根目录");
			holder.icon.setImageBitmap(mIcon1);
			holder.cBox.setChecked(isSelected.get(position));
			holder.cBox.setVisibility(isVisibility.get(position));
		}else if(items.get(position).toString().equals("goparent")){
			holder.text.setText("返回上一级");
			holder.icon.setImageBitmap(mIcon2);
			holder.cBox.setChecked(isSelected.get(position));
			holder.cBox.setVisibility(isVisibility.get(position));
		}else{
			holder.text.setText(f.getName());
			if(f.isDirectory()){
				holder.icon.setImageBitmap(mIcon3);
				holder.cBox.setChecked(isSelected.get(position));
				holder.cBox.setVisibility(isVisibility.get(position));
			}else{
				holder.icon.setImageBitmap(mIcon4);
				holder.cBox.setChecked(isSelected.get(position));
				holder.cBox.setVisibility(isVisibility.get(position));
			}
		}
		return convertView;
	}

	public List<ViewHolder> getVHs() {
		return VHs;
	}

	public final class ViewHolder
	{
		public TextView text;
		public ImageView icon;
		public CheckBox cBox;
	}
}

以上就是所有代码,文件夹以及文件的图片可以自己找,因为我不能上传图片所以,这2个文件以及效果图我会后续补上。(几天之后)

亲们可以根据自己的需要扩展 文件选择(多选或者单选都可以)如果需要我帮忙别客气。



  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值