原創(chuàng)|行業(yè)資訊|編輯:郝浩|2013-10-12 09:26:21.000|閱讀 1536 次
概述:本文陳述了以創(chuàng)建新的目錄來增強目錄選擇器對話框。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
介紹:
每一次你需要在Android應用程序中選擇一個SD卡目錄,你都得加載一種目錄選擇器對話框,由它呈現(xiàn)圖形界面以便你選擇需要的目錄。
不幸的是,正如開發(fā)人員所預料的,Android不提供任何內置的目錄選擇器對話框。因此開發(fā)人員必須自己寫。本文將講述以增強創(chuàng)建對話框的能力,為Android SD卡實現(xiàn)簡單的目錄選擇器對話框。該流程包含在一個單獨的文件中并且不用任何額外資源,除了預定義的Android資源。
執(zhí)行代碼
目錄選擇器對話框是基于AlertDialog,由子目錄的ListView所供給。當前目錄路徑是顯示在AlertDialog標題上。通過點擊子目錄ListView中的項目完成導航向前到一個目錄,然后通過按住“返回”鍵返回。清單中的子目錄是按名稱分類的。當通過按住OK鍵選中需要的目錄,一個“注冊回調”被喚起,它由已選擇目錄的完整路徑所供給。
代碼包含在一個單獨的文件DirectoryChooserDialog.java中。它以當前目錄的子目錄的ListView 加載AlertDialog 并保持追蹤導航目錄。
執(zhí)行DirectoryChooserDialog 類定義如下回調界面。
// Callback interface for selected directory public interface ChosenDirectoryListener { public void onChosenDir(String chosenDir); }
一個回調可以被注冊于DirectoryChooserDialog類構造函數(shù)中。
public DirectoryChooserDialog(Context context, ChosenDirectoryListener chosenDirectoryListener);
通過默認創(chuàng)建能力,新目錄能夠被運用(通過點擊“新文件夾”按鈕),它可以通過setNewFolderEnabled的方式關閉,當禁用新文件夾按鈕隱藏時。
/////////////////////////////////////////////////////////////////////// // setNewFolderEnabled() - enable/disable new folder button /////////////////////////////////////////////////////////////////////// public void setNewFolderEnabled(boolean isNewFolderEnabled) { m_isNewFolderEnabled = isNewFolderEnabled; } public boolean getNewFolderEnabled() { return m_isNewFolderEnabled; }
DirectoryChooserDialog指定兩個公共chooseDirectory 方式來加載目錄選擇器對話框。一個帶有初始目錄參數(shù);另一個沒有。默認初始目錄是SD卡的根目錄。
////////////////////////////////////////////////////////////////////// // chooseDirectory() - load directory chooser dialog for initial // default sdcard root directory ////////////////////////////////////////////////////////////////////// public void chooseDirectory(); //////////////////////////////////////////////////////////////////////////////// // chooseDirectory(String dir) - load directory chooser dialog for initial // input 'dir' directory //////////////////////////////////////////////////////////////////////////////// public void chooseDirectory(String dir);
DirectoryChooserDialog 類全面執(zhí)行如下:
// DirectoryChooserDialog.java package com.example.directorychooser; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnKeyListener; import android.os.Environment; import android.text.Editable; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class DirectoryChooserDialog { private boolean m_isNewFolderEnabled = true; private String m_sdcardDirectory = ""; private Context m_context; private TextView m_titleView; private String m_dir = ""; private List<String> m_subdirs = null; private ChosenDirectoryListener m_chosenDirectoryListener = null; private ArrayAdapter<String> m_listAdapter = null; ////////////////////////////////////////////////////// // Callback interface for selected directory ////////////////////////////////////////////////////// public interface ChosenDirectoryListener { public void onChosenDir(String chosenDir); } public DirectoryChooserDialog(Context context, ChosenDirectoryListener chosenDirectoryListener) { m_context = context; m_sdcardDirectory = Environment.getExternalStorageDirectory().getAbsolutePath(); m_chosenDirectoryListener = chosenDirectoryListener; try { m_sdcardDirectory = new File(m_sdcardDirectory).getCanonicalPath(); } catch (IOException ioe) { } } /////////////////////////////////////////////////////////////////////// // setNewFolderEnabled() - enable/disable new folder button /////////////////////////////////////////////////////////////////////// public void setNewFolderEnabled(boolean isNewFolderEnabled) { m_isNewFolderEnabled = isNewFolderEnabled; } public boolean getNewFolderEnabled() { return m_isNewFolderEnabled; } /////////////////////////////////////////////////////////////////////// // chooseDirectory() - load directory chooser dialog for initial // default sdcard directory /////////////////////////////////////////////////////////////////////// public void chooseDirectory() { // Initial directory is sdcard directory chooseDirectory(m_sdcardDirectory); } //////////////////////////////////////////////////////////////////////////////// // chooseDirectory(String dir) - load directory chooser dialog for initial // input 'dir' directory //////////////////////////////////////////////////////////////////////////////// public void chooseDirectory(String dir) { File dirFile = new File(dir); if (! dirFile.exists() || ! dirFile.isDirectory()) { dir = m_sdcardDirectory; } try { dir = new File(dir).getCanonicalPath(); } catch (IOException ioe) { return; } m_dir = dir; m_subdirs = getDirectories(dir); class DirectoryOnClickListener implements DialogInterface.OnClickListener { public void onClick(DialogInterface dialog, int item) { // Navigate into the sub-directory m_dir += "/" + ((AlertDialog) dialog).getListView().getAdapter().getItem(item); updateDirectory(); } } AlertDialog.Builder dialogBuilder = createDirectoryChooserDialog(dir, m_subdirs, new DirectoryOnClickListener()); dialogBuilder.setPositiveButton("OK", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Current directory chosen if (m_chosenDirectoryListener != null) { // Call registered listener supplied with the chosen directory m_chosenDirectoryListener.onChosenDir(m_dir); } } }).setNegativeButton("Cancel", null); final AlertDialog dirsDialog = dialogBuilder.create(); dirsDialog.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { // Back button pressed if ( m_dir.equals(m_sdcardDirectory) ) { // The very top level directory, do nothing return false; } else { // Navigate back to an upper directory m_dir = new File(m_dir).getParent(); updateDirectory(); } return true; } else { return false; } } }); // Show directory chooser dialog dirsDialog.show(); } private boolean createSubDir(String newDir) { File newDirFile = new File(newDir); if (! newDirFile.exists() ) { return newDirFile.mkdir(); } return false; } private List<String> getDirectories(String dir) { List<String> dirs = new ArrayList<String>(); try { File dirFile = new File(dir); if (! dirFile.exists() || ! dirFile.isDirectory()) { return dirs; } for (File file : dirFile.listFiles()) { if ( file.isDirectory() ) { dirs.add( file.getName() ); } } } catch (Exception e) { } Collections.sort(dirs, new Comparator<String>() { public int compare(String o1, String o2) { return o1.compareTo(o2); } }); return dirs; } private AlertDialog.Builder createDirectoryChooserDialog(String title, List<String> listItems, DialogInterface.OnClickListener onClickListener) { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(m_context); // Create custom view for AlertDialog title containing // current directory TextView and possible 'New folder' button. // Current directory TextView allows long directory path to be wrapped to multiple lines. LinearLayout titleLayout = new LinearLayout(m_context); titleLayout.setOrientation(LinearLayout.VERTICAL); m_titleView = new TextView(m_context); m_titleView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); m_titleView.setTextAppearance(m_context, android.R.style.TextAppearance_Large); m_titleView.setTextColor( m_context.getResources().getColor(android.R.color.white) ); m_titleView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); m_titleView.setText(title); Button newDirButton = new Button(m_context); newDirButton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); newDirButton.setText("New folder"); newDirButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final EditText input = new EditText(m_context); // Show new folder name input dialog new AlertDialog.Builder(m_context). setTitle("New folder name"). setView(input).setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Editable newDir = input.getText(); String newDirName = newDir.toString(); // Create new directory if ( createSubDir(m_dir + "/" + newDirName) ) { // Navigate into the new directory m_dir += "/" + newDirName; updateDirectory(); } else { Toast.makeText( m_context, "Failed to create '" + newDirName + "' folder", Toast.LENGTH_SHORT).show(); } } }).setNegativeButton("Cancel", null).show(); } }); if (! m_isNewFolderEnabled) { newDirButton.setVisibility(View.GONE); } titleLayout.addView(m_titleView); titleLayout.addView(newDirButton); dialogBuilder.setCustomTitle(titleLayout); m_listAdapter = createListAdapter(listItems); dialogBuilder.setSingleChoiceItems(m_listAdapter, -1, onClickListener); dialogBuilder.setCancelable(false); return dialogBuilder; } private void updateDirectory() { m_subdirs.clear(); m_subdirs.addAll( getDirectories(m_dir) ); m_titleView.setText(m_dir); m_listAdapter.notifyDataSetChanged(); } private ArrayAdapter<String> createListAdapter(List<String> items) { return new ArrayAdapter<String>(m_context, android.R.layout.select_dialog_item, android.R.id.text1, items) { @Override public View getView(int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent); if (v instanceof TextView) { // Enable list item (directory) text wrapping TextView tv = (TextView) v; tv.getLayoutParams().height = LayoutParams.WRAP_CONTENT; tv.setEllipsize(null); } return v; } }; } }
用途實例
如下實例表現(xiàn)如何通過點擊按鈕加載目錄選擇器對話框。先前選中的目錄變?yōu)檎{用下一個對話框的初始目錄。
結論:
本文陳述了以創(chuàng)建新的目錄來增強目錄選擇器對話框。
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網(wǎng)