`
hkp2008
  • 浏览: 112072 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Android 目录选择器实现

阅读更多

  

chooserdialog.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <LinearLayout
    	android:orientation="horizontal"
	    android:layout_width="fill_parent"
	    android:layout_height="40dip">
    <Button 
    	android:layout_width="40dip" 
    	android:layout_height="40dip"
    	android:text="HOME"
    	android:id="@+id/btn_home" 
    	android:layout_gravity="left"
    	android:layout_weight="1"
    />
    <LinearLayout android:layout_width="140dip" 
	    android:layout_height="35dip" 
	    android:id="@+id/dir_layout"
	    android:gravity="center"
	    android:layout_weight="1">
	    </LinearLayout>
	<!--  <TextView  
	    android:layout_width="140dip" 
	    android:layout_height="35dip" 
	    android:id="@+id/dir_str"
	    android:gravity="center"
	    android:layout_weight="1"
    /> -->
    <Button 
    	android:layout_width="40dip" 
    	android:layout_height="40dip"
    	android:text="BACK"
    	android:id="@+id/btn_back" 
    	android:layout_gravity="right"
    	android:layout_weight="1"
    />
    </LinearLayout>
    <ListView 
	    android:layout_width="fill_parent"
	    android:layout_height="300dip"
    	android:id="@+id/list_dir"
    />
    <Button 
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:id="@+id/btn_ok"
    	android:text="OK"/>
</LinearLayout>

 package hkp.dirchooser;

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

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * @author HKP
 * 2011-6-17
 *
 */
public class DirChooserDialog extends Dialog implements android.view.View.OnClickListener{
	
	private ListView list;
	ArrayAdapter<String> Adapter;
	ArrayList<String> arr=new ArrayList<String>();
	
	Context context;
	private String path;
	
	private TextView title;
	private EditText et;
	private Button home,back,ok;
	private LinearLayout titleView;
	
	private int type = 1;
	private String[] fileType = null;
	
	public final static int TypeOpen = 1;
	public final static int TypeSave = 2;
	
	/**
	 * @param context
	 * @param type 值为1表示创建打开目录类型的对话框,2为创建保存文件到目录类型的对话框
	 * @param fileType 要过滤的文件类型,null表示只选择目录
	 * @param resultPath 点OK按钮返回的结果,目录或者目录+文件名
	 */
	public DirChooserDialog(Context context,int type,String[]fileType,String resultPath) {
		super(context);
		// TODO Auto-generated constructor stub
		this.context = context;
		this.type = type;
		this.fileType = fileType;
		this.path = resultPath;
	}
	/* (non-Javadoc)
	 * @see android.app.Dialog#dismiss()
	 */
	@Override
	public void dismiss() {
		// TODO Auto-generated method stub
		super.dismiss();
	}
	/* (non-Javadoc)
	 * @see android.app.Dialog#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.chooserdialog);
		
		path = getRootDir();
		arr = (ArrayList<String>) getDirs(path);
		Adapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1, arr);
		
		list = (ListView)findViewById(R.id.list_dir);
		list.setAdapter(Adapter);
		
		list.setOnItemClickListener(lvLis);

		home = (Button) findViewById(R.id.btn_home);
		home.setOnClickListener(this);
		
		back = (Button) findViewById(R.id.btn_back);
		back.setOnClickListener(this);
		
		ok = (Button) findViewById(R.id.btn_ok);
		ok.setOnClickListener(this);
		
		titleView = (LinearLayout) findViewById(R.id.dir_layout);
		
		if(type == TypeOpen){
			title = new TextView(context);
			titleView.addView(title);
			title.setText(path);
		}else if(type == TypeSave){
			et = new EditText(context);
			et.setWidth(240);
			et.setHeight(70);
			et.setGravity(Gravity.CENTER);
			et.setPadding(0, 2, 0, 0);
			titleView.addView(et);
			et.setText("wfFileName");
		}
//		title = (TextView) findViewById(R.id.dir_str);
//		title.setText(path);
		
	}
	//动态更新ListView
	Runnable add=new Runnable(){

		@Override
		public void run() {
			// TODO Auto-generated method stub
			arr.clear();
//System.out.println("Runnable path:"+path);

			//必须得用这种方法为arr赋值才能更新
			List<String> temp = getDirs(path);
			for(int i = 0;i < temp.size();i++)
				arr.add(temp.get(i));
			Adapter.notifyDataSetChanged();
		}   	
    };
   
    private OnItemClickListener lvLis=new OnItemClickListener(){
		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			String temp = (String) arg0.getItemAtPosition(arg2);
//System.out.println("OnItemClick path1:"+path);			
			if(temp.equals(".."))
				path = getSubDir(path);
			else if(path.equals("/"))
				path = path+temp;
			else
				path = path+"/"+temp;
			
//System.out.println("OnItemClick path2"+path);	
			if(type == TypeOpen)
				title.setText(path);
			
			Handler handler=new Handler();
	    	handler.post(add);
		}
    };
	
	private List<String> getDirs(String ipath){
		List<String> file = new ArrayList<String>();
//System.out.println("GetDirs path:"+ipath);		
		File[] myFile = new File(ipath).listFiles();
		if(myFile == null){
			file.add("..");
			
		}else
			for(File f: myFile){
				//过滤目录
				if(f.isDirectory()){
					String tempf = f.toString();
					int pos = tempf.lastIndexOf("/");
					String subTemp = tempf.substring(pos+1, tempf.length());
//					String subTemp = tempf.substring(path.length(),tempf.length());
					file.add(subTemp);	
//System.out.println("files in dir:"+subTemp);
				}
				//过滤知道类型的文件
				if(f.isFile() && fileType != null){
					for(int i = 0;i< fileType.length;i++){
						int typeStrLen = fileType[i].length();
						
						String fileName = f.getPath().substring(f.getPath().length()- typeStrLen);
						if (fileName.toLowerCase().equals(fileType[i])) {
							file.add(f.toString().substring(path.length()+1,f.toString().length()));	
						}
					}
				}
			}
		
		if(file.size()==0)
			file.add("..");
		
//		System.out.println("file[0]:"+file.get(0)+" File size:"+file.size());
		return file;
	}
	/* (non-Javadoc)
	 * @see android.view.View.OnClickListener#onClick(android.view.View)
	 */
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if(v.getId() == home.getId()){
			path = getRootDir();
			if(type == TypeOpen)
				title.setText(path);			
			Handler handler=new Handler();
	    	handler.post(add);
		}else if(v.getId() == back.getId()){
			path = getSubDir(path);
			if(type == TypeOpen)
				title.setText(path);			
			Handler handler=new Handler();
	    	handler.post(add);
		}else if(v.getId() == ok.getId()){
			dismiss();
			if(type == TypeSave)
				path = path+"/"+et.getEditableText().toString()+".wf";
			Toast.makeText(context, path, Toast.LENGTH_SHORT).show();
		}
			
		
	}
	
	private String getSDPath(){ 
	       File sdDir = null; 
	       boolean sdCardExist = Environment.getExternalStorageState()   
	                           .equals(android.os.Environment.MEDIA_MOUNTED);   //判断sd卡是否存在 
	       if(sdCardExist)   
	       {                               
	         sdDir = Environment.getExternalStorageDirectory();//获取根目录 
	      }   
	       if(sdDir == null){
//Toast.makeText(context, "No SDCard inside!",Toast.LENGTH_SHORT).show();
	    	   return null;
	       }
	       return sdDir.toString(); 
	       
	} 
	
	private String getRootDir(){
		String root = "/";
		
		path = getSDPath();
		if (path == null)
			path="/";
		
		return root;
	}
	
	private String getSubDir(String path){
		String subpath = null;
		
		int pos = path.lastIndexOf("/");
		
		if(pos == path.length()){
			path = path.substring(0,path.length()-1);
			pos = path.lastIndexOf("/");
		}
		
		subpath = path.substring(0,pos);
		
		if(pos == 0)
			subpath = path;
		
		return subpath;
	}
}

 package hkp.dirchooser;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btn = (Button) findViewById(R.id.btn_open);
        btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String path = null;
				String [] fileType = {"dst"};//要过滤的文件类型列表
				DirChooserDialog dlg = new DirChooserDialog(MainActivity.this,2,fileType,path);
				dlg.setTitle("Choose dst file dir");
				dlg.show();
				
			}
		});
    }
}
1
0
分享到:
评论

相关推荐

    Android文件目录选择器

    这个“Android文件目录选择器”是基于某个博客文章的代码实现,虽然原始作者没有提供完整的代码,但根据描述,只需几张图片就能完成基本功能。下面将详细介绍这个功能的实现原理和相关知识点。 1. **文件系统访问...

    android 时间选择器

    综上所述,这个“android 时间选择器”项目涉及到Android自定义视图开发、UI定制、事件处理、动画实现等多个技术点,对于提升Android应用的用户体验具有重要意义。通过学习和使用这样的组件,开发者可以更自由地塑造...

    Android地名选择器 全国省市区选择器 城市选择 区县选择

    总结来说,"Android地名选择器 全国省市区选择器 城市选择 区县选择"是一个实现中国地理位置选择的Android组件。它涉及UI设计、数据结构、事件处理、搜索功能等多个方面,开发者需要综合运用Android的各种技术来实现...

    实现了Android开发自定义年月日日期选择器,时分时间选择器

    本话题主要探讨如何实现自定义的年月日日期选择器和时分时间选择器,这两个组件在许多应用程序中都非常常见,例如在事件安排、预约服务或者设置提醒等功能中。 首先,我们来看如何创建自定义的年月日日期选择器。这...

    android滚轮选择器

    以`androidWheelView-master`为例,这是一个开源项目,它提供了一个自定义的滚轮选择器实现。项目可能包含了以下关键部分: 1. `WheelView`类:这是自定义滚轮选择器的核心类,它实现了滚轮的绘制、滚动逻辑以及...

    Android 横向选择器(HorizontalPickerView.java)

    自定义Android 横向选择器

    完美的android颜色选择器

    在本项目“完美的android颜色选择器”中,我们将探讨其核心特点以及实现方法。 首先,颜色选择器提供了用户交互的界面,用户可以直接在颜色区域内点击选取喜欢的颜色。这种设计让用户能够直观地看到所有可能的颜色...

    Android 地区选择器,简洁集成,节省资源

    1. **地区选择器实现**: - 在Android中,地区选择器通常由一系列的ListView或者RecyclerView组成,显示省、市、区的分级列表。用户逐级选择,最终得到一个完整的地址信息。 - 此demo可能采用递归加载的方式,即当...

    android文件选择器

    在Android开发中,文件选择器是一个非常常见的组件,它允许用户在设备的文件系统中浏览并选择所需的文件或目录。本项目"android文件选择器"是专为Android平台设计的一个文件选择工具,采用PopupWindow实现,提供了一...

    qt for android图片选择器

    3. **图片选择器实现**: 要实现图片选择器,通常需要启动一个 Intent,如 ACTION_PICK 或 ACTION_GET_CONTENT,这样用户可以选择一张图片。在 Java 代码中创建这样的 Intent,然后使用 QAndroidJniObject 将其转换...

    android 颜色选择器

    本篇文章将深入探讨Android颜色选择器的实现原理、使用方法以及如何在项目中自定义和集成。 首先,Android SDK提供了一个内置的颜色选择器组件,名为`ColorPickerDialog`,但这通常只适用于简单的颜色选择需求。要...

    Android自定义日期选择器源码

    在Android开发中,系统默认的日期和时间选择器虽然实用,但往往无法满足所有场景的需求。因此,开发者经常需要自定义日期选择器来提供更符合应用风格或特定功能的交互体验。这篇内容将深入探讨如何在Android中创建一...

    Android时间选择器两种实现(自定义的年、月、日、时、分)

    Android时间选择器有两种常见的实现方式:使用系统的`DatePicker`和`TimePicker`,以及自定义的`MyTimeSelector`组件。前者简洁易用,适合快速集成;后者提供了更大的定制空间,可以根据项目需求调整样式和功能。...

    Android中文件选择器的实现(代码)

    下面是一个简单的文件选择器实现步骤: 1. **创建UI**:布局文件中包含一个`RecyclerView`,用于展示文件和目录。每个条目可以是一个自定义的`ViewHolder`,显示文件名、大小、类型等。 2. **数据模型**:创建一个...

    android时间选择器,可进行农历阳历切换,带年月日时分

    时间选择器在Android中通常是通过DatePicker或TimePicker组件实现的。在这个项目中,开发者可能扩展了这些原生组件或者创建了自定义视图,以支持农历和阳历的切换。这种切换功能需要与农历日历算法相结合,例如,...

    android 滚轮选择器

    在本篇内容中,我们将深入探讨如何在Android应用中实现城市级联和时间选择功能,利用滚轮选择器进行高效的数据选择。 首先,我们来看城市级联的选择。在实际应用中,可能需要用户选择国家、省份、城市这样逐级递进...

    Android ListView三级联动实现地址选择器

    在Android开发中,...总之,Android ListView的三级联动实现地址选择器涉及到了数据结构设计、事件监听、数据加载和UI布局等多个方面。通过巧妙地组合和定制,我们可以创建出高效、用户体验良好的地址选择组件。

    Android城市选择器

    总结来说,"Android城市选择器"是一个高效、美观且易于集成的组件,它借助高德地图的强大功能,为开发者提供了在Android应用中实现城市选择功能的便利途径。无论你是初学者还是经验丰富的开发者,这个选择器都能帮助...

    Android颜色选择器大全

    本文将详细介绍Android颜色选择器的种类、实现方式以及如何在项目中集成这4种不同的颜色选择器样式。 1. **彩虹颜色选择器(Rainbow Color Picker)** 这种颜色选择器通常通过一个滑块来让用户选择色相(Hue),而...

Global site tag (gtag.js) - Google Analytics