這個(gè)項(xiàng)目以及代碼中使用的未在下面代碼給出源碼的方法都在這里:https://github.com/NashLegend/LegendUtils
豐縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
第二種對(duì)話框的源碼在這里:https://github.com/NashLegend/LegendExplorer/,這是一個(gè)文件瀏覽器源碼。
Android文件對(duì)話框,一般用的分兩種。
一是我們自己程序內(nèi)使用的,當(dāng)我們需要讓用戶選擇一個(gè)文件或文件夾進(jìn)行上傳、下載或者其他操作時(shí)有時(shí)會(huì)用到。
二是系統(tǒng)的全局文件對(duì)話框,當(dāng)一個(gè)程序發(fā)起一個(gè)要選擇的Intent,那么這個(gè)對(duì)話框就會(huì)彈出,用戶進(jìn)行操作后返回行距的文件或者文件夾,比如寫一封郵件如果想同時(shí)發(fā)送一個(gè)附件的時(shí)候,就會(huì)發(fā)起一個(gè)Intent,然后我們的選擇文件對(duì)話框會(huì)彈出,讓用戶來選擇文件。
這個(gè)文件對(duì)話框大約長下面這個(gè)樣子(圖標(biāo)是不是很熟悉,這是直接取的ES文件瀏覽器的圖標(biāo)),它可以實(shí)現(xiàn)文件、文件夾的單選、多選、混選,當(dāng)用戶點(diǎn)擊確定時(shí),返回一個(gè)ArrayList<File>:
下面是如何寫這個(gè)文件對(duì)話框。
首先我們需要一個(gè),一個(gè)Dialog需要一個(gè)view來顯示,也就是我們看到的。我們給它起名FileDialogView。很顯然它需要兩個(gè)Button用于確定取消,一個(gè)ImageButton用于返回上級(jí),多選的話還要再加一個(gè)【全部選擇、全部取消】的CheckBox(上圖為單選文件夾的示例,所以沒有出現(xiàn)).一個(gè)EditText用于顯示當(dāng)前路徑、以及最重要的——ListView以及它的adapter,我們叫這個(gè)adapter為FileListAdapter。
下面是這個(gè)FileDialogView的代碼(這個(gè)項(xiàng)目不難,代碼里面的注釋應(yīng)該足夠清楚了……)。
/** * FileDialog的view * * @author NashLegend */ public class FileDialogView extends FrameLayout implements OnClickListener, OnCheckedChangeListener { private FileListAdapter adapter; private ListView listView;//文件列表 private EditText pathText;//當(dāng)前路徑 private ImageButton backButton;//返回上級(jí)按鈕 private CheckBox selectAllButton;//全選按鈕 private int fileMode = FileDialog.FILE_MODE_OPEN_MULTI;//選擇文件方式,默認(rèn)為文件、文件夾混選 private String initialPath = "/";//用來指定剛打開時(shí)的目錄,默認(rèn)為根目錄 private Button cancelButton; private Button okButton; public FileDialogView(Context context) { super(context); initView(context); } public FileDialogView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public FileDialogView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(context); } /** * 初始化view */ private void initView(Context context) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.dialog_file, this); listView = (ListView) findViewById(R.id.listview_dialog_file); pathText = (EditText) findViewById(R.id.edittext_dialog_file_path); backButton = (ImageButton) findViewById(R.id.p_w_picpathbutton_dialog_file_back); selectAllButton = (CheckBox) findViewById(R.id.checkbox_dialog_file_all); cancelButton = (Button) findViewById(R.id.button_dialog_file_cancel); okButton = (Button) findViewById(R.id.button_dialog_file_ok); backButton.setOnClickListener(this); cancelButton.setOnClickListener(this); okButton.setOnClickListener(this); selectAllButton.setOnCheckedChangeListener(this); pathText.setKeyListener(null);//不需要彈起鍵盤 adapter = new FileListAdapter(context); adapter.setDialogView(this); listView.setAdapter(adapter); } /** * 打開目錄 * * @param file 要打開的文件夾 * */ public void openFolder(File file) { if (!file.exists() || !file.isDirectory()) { // 若不存在此目錄,則打開SD卡根目錄 file = Environment.getExternalStorageDirectory(); } //openFolder用來讀取文件列表詳見FileListAdapter的代碼 adapter.openFolder(file); } /** * 打開目錄 * * @param path * 要打開的文件夾路徑 */ public void openFolder(String path) { openFolder(new File(path)); } /** * 打開初始目錄 */ public void openFolder() { openFolder(initialPath); } /** * 返回上級(jí)目錄 */ private void back2ParentLevel() { File file = adapter.getCurrentDirectory(); // 如果當(dāng)前目錄不為空且父目錄不為空,則打開父目錄 if (file != null && file.getParentFile() != null) { openFolder(file.getParentFile()); } } /** * 選中當(dāng)前目錄所有文件 */ private void selectAll() { adapter.selectAll(); } /** * 取消選中當(dāng)前目錄所有文件 */ private void unselectAll() { adapter.unselectAll(); } public void unselectCheckBox() { selectAllButton.setOnCheckedChangeListener(null); selectAllButton.setChecked(false); selectAllButton.setOnCheckedChangeListener(this); } /** * @return 返回選中的文件列表 */ public ArrayList<File> getSelectedFiles() { ArrayList<File> list = new ArrayList<File>(); if (adapter.getSelectedFiles().size() > 0) { list = adapter.getSelectedFiles(); } else { //如果點(diǎn)擊確定的時(shí)候沒有選擇文件并且模式是選擇單個(gè)文件夾,那么就返回當(dāng)前目錄 if (fileMode == FileDialog.FILE_MODE_OPEN_FOLDER_SINGLE) { list.add(adapter.getCurrentDirectory()); } } return list; } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.p_w_picpathbutton_dialog_file_back) { back2ParentLevel(); } } public EditText getPathText() { return pathText; } public int getFileMode() { return fileMode; } public void setFileMode(int fileMode) { this.fileMode = fileMode; if (fileMode > FileDialog.FILE_MODE_OPEN_FILE_MULTI) { // 單選模式應(yīng)該看不到全選按鈕才對(duì) selectAllButton.setVisibility(View.GONE); } else { selectAllButton.setVisibility(View.VISIBLE); } } public String getInitialPath() { return initialPath; } public void setInitialPath(String initialPath) { this.initialPath = initialPath; } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (selectAllButton.isChecked()) { selectAll(); } else { unselectAll(); } } public CheckBox getSelectAllButton() { return selectAllButton; } }
FileDialogView代碼并不多,只負(fù)責(zé)了構(gòu)建界面的任務(wù)。
下面是FileListAdapter的代碼,F(xiàn)ileListAdapter負(fù)責(zé)讀取文件夾、全選、反選、排序、返回選中文件,數(shù)據(jù)對(duì)象為FileItem:
package com.example.legendutils.BuildIn; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import com.example.legendutils.Dialogs.FileDialog; import android.annotation.SuppressLint; import android.content.Context; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public class FileListAdapter extends BaseAdapter { private ArrayList<FileItem> list = new ArrayList<FileItem>(); private Context mContext; private File currentDirectory; private FileDialogView dialogView; public FileListAdapter(Context Context) { mContext = Context; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = new FileItemView(mContext); holder.fileItemView = (FileItemView) convertView; convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.fileItemView.setFileItem(list.get(position), this, dialogView.getFileMode()); return holder.fileItemView; } class ViewHolder { FileItemView fileItemView; } public ArrayList<FileItem> getList() { return list; } public void setList(ArrayList<FileItem> list) { this.list = list; } /** * 打開文件夾,更新文件列表 * * @param file */ public void openFolder(File file) { if (file != null && file.exists() && file.isDirectory()) { if (!file.equals(currentDirectory)) { // 與當(dāng)前目錄不同 currentDirectory = file; list.clear(); File[] files = file.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { File tmpFile = files[i]; if (tmpFile.isFile() && (dialogView.getFileMode() == FileDialog.FILE_MODE_OPEN_FOLDER_MULTI || dialogView .getFileMode() == FileDialog.FILE_MODE_OPEN_FOLDER_SINGLE)) { //如果只能選擇文件夾并且當(dāng)前文件不是文件夾,那則跳過 continue; } list.add(new FileItem(files[i])); } } files = null; sortList(); notifyDataSetChanged(); } } //改變FileDialogView的當(dāng)前路徑顯示 dialogView.getPathText().setText(file.getAbsolutePath()); } /** * 選擇當(dāng)前目錄下所有文件 */ public void selectAll() { int mode = dialogView.getFileMode(); if (mode > FileDialog.FILE_MODE_OPEN_FILE_MULTI) { // 這個(gè)if不會(huì)發(fā)生,我為啥要寫…… return; } for (Iterator<FileItem> iterator = list.iterator(); iterator.hasNext();) { FileItem fileItem = (FileItem) iterator.next(); if (mode == FileDialog.FILE_MODE_OPEN_FILE_MULTI && fileItem.isDirectory()) { // fileItem是目錄,但是只能選擇文件,則跳過 continue; } if (mode == FileDialog.FILE_MODE_OPEN_FOLDER_MULTI && !fileItem.isDirectory()) { // fileItem是文件,但是只能選擇目錄,則跳過 continue; } fileItem.setSelected(true); } notifyDataSetChanged(); } /** * 取消所有文件的選中狀態(tài) */ public void unselectAll() { for (Iterator<FileItem> iterator = list.iterator(); iterator.hasNext();) { FileItem fileItem = (FileItem) iterator.next(); fileItem.setSelected(false); } notifyDataSetChanged(); } /** * 選中一個(gè)文件,只在選中時(shí)調(diào)用,取消選中不調(diào)用,且只由FileItemView調(diào)用 * * @param fileItem */ public void selectOne(FileItem fileItem) { int mode = dialogView.getFileMode(); if (mode > FileDialog.FILE_MODE_OPEN_FILE_MULTI) { // 如果是單選 if (mode == FileDialog.FILE_MODE_OPEN_FILE_SINGLE && fileItem.isDirectory()) { // fileItem是目錄,但是只能選擇文件,則返回 return; } if (mode == FileDialog.FILE_MODE_OPEN_FOLDER_SINGLE && !fileItem.isDirectory()) { // fileItem是文件,但是只能選擇目錄,則返回 return; } for (Iterator<FileItem> iterator = list.iterator(); iterator .hasNext();) { FileItem tmpItem = (FileItem) iterator.next(); if (tmpItem.equals(fileItem)) { tmpItem.setSelected(true); } else { tmpItem.setSelected(false); } } } else { // 如果是多選 if (mode == FileDialog.FILE_MODE_OPEN_FILE_MULTI && fileItem.isDirectory()) { // fileItem是目錄,但是只能選擇文件,則返回 return; } if (mode == FileDialog.FILE_MODE_OPEN_FOLDER_MULTI && !fileItem.isDirectory()) { // fileItem是文件,但是只能選擇目錄,則返回 return; } fileItem.setSelected(true); } notifyDataSetChanged(); } public void sortList() { FileItemComparator comparator = new FileItemComparator(); Collections.sort(list, comparator); } /** * 取消一個(gè)的選擇,其他邏輯都在FileItemView里面 */ public void unselectOne() { dialogView.unselectCheckBox(); } /** * @return 選中的文件列表 */ public ArrayList<File> getSelectedFiles() { ArrayList<File> selectedFiles = new ArrayList<File>(); for (Iterator<FileItem> iterator = list.iterator(); iterator.hasNext();) { FileItem file = iterator.next();// 強(qiáng)制轉(zhuǎn)換為File if (file.isSelected()) { selectedFiles.add(file); } } return selectedFiles; } public class FileItemComparator implements Comparator<FileItem> { @Override public int compare(FileItem lhs, FileItem rhs) { if (lhs.isDirectory() != rhs.isDirectory()) { // 如果一個(gè)是文件,一個(gè)是文件夾,優(yōu)先按照類型排序 if (lhs.isDirectory()) { return -1; } else { return 1; } } else { // 如果同是文件夾或者文件,則按名稱排序 return lhs.getName().toLowerCase().compareTo(rhs.getName().toLowerCase()); } } } public File getCurrentDirectory() { return currentDirectory; } public FileDialogView getDialogView() { return dialogView; } public void setDialogView(FileDialogView dialogView) { this.dialogView = dialogView; } }
下面是FileItemView,它是ListView的元素,用來顯示每一個(gè)文件。數(shù)據(jù)對(duì)象為FileItem
/** * 文件列表單個(gè)item的view * * @author NashLegend */ public class FileItemView extends FrameLayout implements OnClickListener, OnCheckedChangeListener { private ImageView icon;//文件圖標(biāo) private TextView title;//文件名 private CheckBox checkBox;//選擇按鈕 private ViewGroup rootFileItemView;//FileItemView的xml文件的根view private FileListAdapter adapter; private int fileMode = FileDialog.FILE_MODE_OPEN_MULTI; private boolean selectable = true; private FileItem fileItem; public FileItemView(Context context) { super(context); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.view_file_item, this); icon = (ImageView) findViewById(R.id.p_w_picpath_file_icon); title = (TextView) findViewById(R.id.text_file_title); rootFileItemView = (ViewGroup) findViewById(R.id.rootFileItemView); checkBox = (CheckBox) findViewById(R.id.checkbox_file_item_select); setOnClickListener(this); } public FileItem getFileItem() { return fileItem; } public void setFileItem(FileItem fileItem, FileListAdapter adapter, int fileMode) { this.fileItem = fileItem; this.adapter = adapter; this.fileMode = fileMode; icon.setImageResource(fileItem.getIcon()); title.setText(fileItem.getName()); toggleSelectState(); if (!fileItem.isDirectory() && (fileMode == FileDialog.FILE_MODE_OPEN_FOLDER_MULTI || fileMode == FileDialog.FILE_MODE_OPEN_FOLDER_SINGLE)) { //如果選擇模式與當(dāng)前文件類型不符,則設(shè)計(jì)為不可選擇,比如在只可選擇文件平時(shí),文件不可選 checkBox.setEnabled(false); selectable = false; checkBox.setOnCheckedChangeListener(null); return; } if (fileItem.isDirectory() && (fileMode == FileDialog.FILE_MODE_OPEN_FILE_MULTI || fileMode == FileDialog.FILE_MODE_OPEN_FILE_SINGLE)) { //如果選擇模式與當(dāng)前文件類型不符,則設(shè)計(jì)為不可選擇,比如在只可選擇文件時(shí),文件夾不可選 checkBox.setEnabled(false); selectable = false; checkBox.setOnCheckedChangeListener(null); return; } selectable = true; checkBox.setEnabled(true); checkBox.setOnCheckedChangeListener(this); } /** * 切換選中、未選中狀態(tài),fileItem.setSelected(boolean)先發(fā)生; */ public void toggleSelectState() { if (fileItem.isSelected()) { rootFileItemView .setBackgroundResource(R.drawable.bg_file_item_select); } else { rootFileItemView .setBackgroundResource(R.drawable.bg_file_item_normal); } checkBox.setOnCheckedChangeListener(null); checkBox.setChecked(fileItem.isSelected()); checkBox.setOnCheckedChangeListener(this); } @Override public void onClick(View v) { if (v.getId() != R.id.checkbox_file_item_select) { //被點(diǎn)擊時(shí),如果是文件夾則打開文件夾,如果是文件則選中文件 if (fileItem.isDirectory()) { openFolder(); } else { // 選中一個(gè) selectOne(); } } } public void selectOne() {//選中一個(gè)文件(夾) if (selectable) { if (fileItem.isSelected()) { // 取消選中狀態(tài),只在FileItemView就可以 fileItem.setSelected(!fileItem.isSelected()); toggleSelectState(); adapter.unselectOne(); } else { // 如果要選中某個(gè)FileItem,則必須要在adapter里面進(jìn)行,因?yàn)槿绻菃芜x的話,還要取消其他的選中狀態(tài) adapter.selectOne(fileItem); } } } /** * 打開文件夾 */ public void openFolder() { adapter.openFolder(fileItem); } public FileListAdapter getAdapter() { return adapter; } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { adapter.selectOne(fileItem); } else { fileItem.setSelected(false); rootFileItemView .setBackgroundResource(R.drawable.bg_file_item_normal); adapter.unselectOne(); } } public int getFileMode() { return fileMode; } }
上面所使用的數(shù)據(jù)對(duì)象FileItem其實(shí)很簡(jiǎn)單,只是一個(gè)繼承了File,并僅僅多了icon字段和selected字段的類。這里不寫出來了,詳見上面的地址。
現(xiàn)在有了View,只要把它放到Dialog里就可以了,Dialog很簡(jiǎn)單了,我們?nèi)匀灰勒障到y(tǒng)的Dialog寫一個(gè)Builder以方便使用。代碼如下:
public class FileDialog extends Dialog { /** * 以打開文件模式打開文件對(duì)話框,有可能是文件夾也有可能是文件,可多選,最終返回值為一個(gè)File對(duì)象列表。 */ public static final int FILE_MODE_OPEN_MULTI = 0; /** * 以打開文件模式打開文件對(duì)話框,只能選擇文件夾而不是文件,可多選,最終返回值為一個(gè)File對(duì)象列表。 */ public static final int FILE_MODE_OPEN_FOLDER_MULTI = 1; /** * 以打開文件模式打開文件對(duì)話框,只能選擇文件而不是文件夾,可多選,最終返回值為一個(gè)File對(duì)象列表。 */ public static final int FILE_MODE_OPEN_FILE_MULTI = 2; /** * 以打開文件模式打開文件對(duì)話框,有可能是文件夾也有可能是文件,最終返回值為一個(gè)長度為1的File對(duì)象列表。 */ public static final int FILE_MODE_OPEN_SINGLE = 3; /** * 以打開文件模式打開文件對(duì)話框,只能選擇文件夾而不是文件,最終返回值為一個(gè)長度為1的File對(duì)象列表。 */ public static final int FILE_MODE_OPEN_FOLDER_SINGLE = 4; /** * 以打開文件模式打開文件對(duì)話框,只能選擇文件而不是文件夾,最終返回值為一個(gè)長度為1的File對(duì)象列表。 */ public static final int FILE_MODE_OPEN_FILE_SINGLE = 5; public FileDialog(Context context) { super(context); } public FileDialog(Context context, int theme) { super(context, theme); } public FileDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { super(context, cancelable, cancelListener); } public interface FileDialogListener { public void onFileSelected(ArrayList<File> files); public void onFileCanceled(); } public static class Builder { private int fileMode = FileDialog.FILE_MODE_OPEN_MULTI; private String initialPath = Environment.getExternalStorageDirectory() .getAbsolutePath(); private FileDialogListener fileSelectListener; private FileDialogView dialogView; private Context context; private boolean canceledOnTouchOutside = true; private boolean cancelable = true; private String title = "選擇文件"; public Builder(Context context) { this.context = context; } public Builder setCanceledOnTouchOutside(boolean flag) { canceledOnTouchOutside = flag; return this; } public Builder setCancelable(boolean flag) { cancelable = flag; return this; } public Builder setFileMode(int fileMode) { this.fileMode = fileMode; return this; } public Builder setInitialPath(String initialPath) { this.initialPath = initialPath; return this; } public Builder setTitle(String title) { this.title = title; return this; } public Builder setFileSelectListener( FileDialogListener fileSelectListener) { this.fileSelectListener = fileSelectListener; return this; } /** * 必須強(qiáng)制設(shè)置dialog的大小,因?yàn)長istView大小必須確定,否則ListView的Adapter的getView會(huì)執(zhí)行很多遍, * 次數(shù)取決于listview最終能顯示多少項(xiàng)。 * * @return */ public FileDialog create(int width, int height) { final FileDialog dialog = new FileDialog(context); dialogView = new FileDialogView(context); dialogView.setFileMode(fileMode); dialogView.setInitialPath(initialPath); dialogView.openFolder(); dialog.setTitle(title); dialog.setCancelable(cancelable); dialog.setCanceledOnTouchOutside(canceledOnTouchOutside); dialog.setContentView(dialogView, new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); if (width > 0 && height > 0) { dialog.getWindow().setLayout(width, height); } Button okButton = (Button) dialogView .findViewById(R.id.button_dialog_file_ok); Button cancelButton = (Button) dialogView .findViewById(R.id.button_dialog_file_cancel); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 點(diǎn)擊確定按鈕,返回文件列表 if (fileSelectListener != null) { if (dialogView.getSelectedFiles().size() > 0) { fileSelectListener.onFileSelected(dialogView .getSelectedFiles()); } else { fileSelectListener.onFileCanceled(); } } dialog.dismiss(); } }); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //點(diǎn)擊取消按鈕,直接dismiss if (fileSelectListener != null) { fileSelectListener.onFileCanceled(); } dialog.dismiss(); } }); return dialog; } /** * 使得FileDialog大小和activity一樣,在Activity創(chuàng)建完成之前,返回的數(shù)字可能不對(duì) * * @param activity * @return */ public FileDialog create(Activity activity) { //下面這兩個(gè)方法是獲得窗口的寬高,方法不在這里貼出了,詳情見上面給出的項(xiàng)目地址 int width = DisplayUtil.getWindowWidth(activity); int height = DisplayUtil.getWindowHeight(activity); return create(width, height); } } }
如何使用它:
FileDialog dialog = new FileDialog.Builder(getActivity()) .setFileMode(FileDialog.FILE_MODE_OPEN_FOLDER_SINGLE) .setCancelable(true).setCanceledOnTouchOutside(false) .setTitle("selectFolder") .setFileSelectListener(new FileDialogListener() { @Override public void onFileSelected(ArrayList<File> files) { if (files.size() > 0) { copy2Folder(getSelectedFiles(), files.get(0)); } } @Override public void onFileCanceled() { ToastUtil.showToast(getActivity(), "Copy Cancelled!"); } }).create(getActivity()); dialog.show();
至于第二種接收系統(tǒng)通知其實(shí)在同小異,核心代碼都跟上面一樣,唯一的區(qū)別是,它其實(shí)是一個(gè)Activity,我們叫它PickerActivity,使用了FileDialogView的Activity,而上面的是Dialog……
要接收打開文件的Intent,要在AndroidMenifest.xml的這個(gè)Activity節(jié)點(diǎn)***冊(cè)IntentFilter。如下:
<intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.OPENABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter>
PickerActivity代碼,跟FileDialog基本差不多。
public class PickerActivity extends Activity { private FileDialogView pickerView; private Button cancelButton; private Button okButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_picker); setTitle("Pick A File"); Intent intent = getIntent(); if (intent != null && Intent.ACTION_GET_CONTENT.equals(intent.getAction())) { pickerView = (FileDialogView) findViewById(R.id.picker); pickerView.setFileMode(FileDialog.FILE_MODE_OPEN_FILE_SINGLE); pickerView.setInitialPath(Environment.getExternalStorageDirectory() .getAbsolutePath()); pickerView.openFolder(); cancelButton = (Button) pickerView .findViewById(com.example.legendutils.R.id.button_dialog_file_cancel); okButton = (Button) pickerView .findViewById(com.example.legendutils.R.id.button_dialog_file_ok); cancelButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setResult(RESULT_CANCELED); finish(); } }); okButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ArrayList<File> files = pickerView.getSelectedFiles(); if (files != null && files.size() > 0) { File file = files.get(0); Intent intent = new Intent(); Uri uri = Uri.fromFile(file); intent.setData(uri); setResult(RESULT_OK, intent); finish(); } } }); } } }
文章題目:兩個(gè)Android選擇文件對(duì)話框
當(dāng)前網(wǎng)址:http://www.rwnh.cn/article46/ipcghg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)、域名注冊(cè)、微信小程序、品牌網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)