Quantcast
Channel: Uncategorized – UlduzSoft
Viewing all articles
Browse latest Browse all 18

Android dialog to choose a directory or file based on AlertDialog

$
0
0

This dialog could be used to let the user choose a file or directory. Since it is based on AlertDialog it doesn’t have to be instantiated through startActivity() and therefore could be used, for example, in a PrederenceDialog subclass. The provided code only selects the directories, but it is easy to modify it to select the specific files as well. This code is used in the Ulduzsoft Karaoke Player. Apache license.

/*
 * Copyright (C) 2011-2012 George Yunaev
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 */
public class DialogChooseDirectory implements OnItemClickListener, OnClickListener
{
	public interface Result
	{
		void onChooseDirectory( String dir );
	}

	List<File> m_entries = new ArrayList< File >();
	File m_currentDir;
	Context	m_context;
	AlertDialog m_alertDialog;
	ListView m_list;
	Result m_result = null;

	public class DirAdapter extends ArrayAdapter< File >
	{
		public DirAdapter( int resid )
		{
			super( m_context, resid, m_entries );
		}

		// This function is called to show each view item
		@Override
		public View getView(int position, View convertView, ViewGroup parent)
		{
			TextView textview = (TextView) super.getView( position, convertView, parent );

			if ( m_entries.get(position) == null )
			{
				textview.setText( ".." );
				textview.setCompoundDrawablesWithIntrinsicBounds( m_context.getResources().getDrawable( R.drawable.icon_parentdir ), null, null, null );
			}
			else
			{
				textview.setText( m_entries.get(position).getName() );
				textview.setCompoundDrawablesWithIntrinsicBounds( m_context.getResources().getDrawable( R.drawable.fileicon_dir ), null, null, null );
			}

			return textview;
		}
	}

	private void listDirs()
	{
		m_entries.clear();

		// Get files
		File[] files = m_currentDir.listFiles();

		// Add the ".." entry
		if ( m_currentDir.getParent() != null )
			m_entries.add( new File("..") );

		if ( files != null )
		{
			for ( File file : files )
			{
				if ( !file.isDirectory() )
					continue;

				m_entries.add( file );
			}
		}

		Collections.sort( m_entries, new Comparator<File>() { 
				public int compare(File f1, File f2)
				{
					return f1.getName().toLowerCase().compareTo( f2.getName().toLowerCase() );
				}
		} );
	}

	public DialogChooseDirectory( Context ctx, Result res, String startDir )
	{
		m_context = ctx;
		m_result = res;

		if ( startDir != null )
			m_currentDir = new File( startDir );
		else
			m_currentDir = Environment.getExternalStorageDirectory();

		listDirs();
		DirAdapter adapter = new DirAdapter( R.layout.listitem_row_textview );

		AlertDialog.Builder builder = new AlertDialog.Builder( ctx );
		builder.setTitle( R.string.dlg_choosedir_title );
		builder.setAdapter( adapter, this );

		builder.setPositiveButton( "Ok", new DialogInterface.OnClickListener() {
	           public void onClick(DialogInterface dialog, int id) {
	        	   if ( m_result != null )
	        		   m_result.onChooseDirectory( m_currentDir.getAbsolutePath() );
	        	   dialog.dismiss();
	           }
	       });

		builder.setNegativeButton( "Cancel", new DialogInterface.OnClickListener() {
	           public void onClick(DialogInterface dialog, int id) {
	                dialog.cancel();
	           }
	       });

		AlertDialog m_alertDialog = builder.create();
		m_list = m_alertDialog.getListView();
		m_list.setOnItemClickListener( this );
		m_alertDialog.show();
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View list, int pos, long id )
	{
		if ( pos < 0 || pos >= m_entries.size() )
			return;

		if ( m_entries.get( pos ).getName().equals( ".." ) )
			m_currentDir = m_currentDir.getParentFile();
		else
			m_currentDir = m_entries.get( pos );

		listDirs();
		DirAdapter adapter = new DirAdapter( R.layout.listitem_row_textview );
		m_list.setAdapter( adapter );
	}

	public void onClick(DialogInterface dialog, int which)
	{
	}
}

Viewing all articles
Browse latest Browse all 18

Trending Articles