An easy file / folder picker dialog fragment which is easily to implement. Nothing special is required, you just need to add few lines of code!!
Use Gradle:
compile 'com.kingfisherphuoc:easy-file-folder-picker-dialog:1.4'
Look at this code below? Is this easy? Nothing special is require.
You just need using FilePickerDialogFragment.Builder()
to create new instance of FilePickerDialogFragment
and show it whenever you want. We handle runtime permission for you when showing the dialog.
The DialogConfig
is optional. You can declare it or not, it's up to you.
DialogConfig dialogConfig = new DialogConfig.Builder()
.enableMultipleSelect(true) // default is false
.enableFolderSelect(true) // default is false
.initialDirectory(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Android") // default is sdcard
.supportFiles(new SupportFile(".3gpp", R.drawable.ic_audio), new SupportFile(".mp3", 0), new SupportFile(".pdf", R.drawable.ic_pdf)) // default is showing all file types.
.build();
new FilePickerDialogFragment.Builder()
.configs(dialogConfig)
.onFilesSelected(new FilePickerDialogFragment.OnFilesSelectedListener() {
@Override
public void onFileSelected(List<File> list) {
Log.e(TAG, "total Selected file: " + list.size());
for (File file : list) {
Log.e(TAG, "Selected file: " + file.getAbsolutePath());
}
}
})
.onFolderLoadListener(new FilePickerDialogFragment.OnFolderLoadListener() {
@Override
public void onLoadFailed(String path) {
//Could not access folder because of user permissions, sdcard is not readable...
}
})
.build()
.show(getSupportFragmentManager(), null);
You can even customize everything in the dialog. Look at the exapmle MyExampleCustomDialog
as below. Some properties are optional (like current folder path, toolbar, done button...).
public class MyExampleCustomDialog extends BaseFilePickerDialogFragment {
@NonNull
@Override
protected int getLayoutId() {
return R.layout.dialog_custom;
}
@NonNull
@Override
protected int getRecyclerViewId() {
return R.id.recyclerview;
}
@Nullable
@Override
protected int getTextViewCurrentFolderId() {
return 0;
}
@Override
protected int getToolbarId() {
return R.id.myToolBar;
}
@Nullable
@Override
protected int getDoneButtonId() {
return 0;
}
@NonNull
@Override
protected int getLayoutRowId() {
return R.layout.item_row;
}
@NonNull
@Override
protected int getImageViewIconId() {
return R.id.ivImage;
}
@NonNull
@Override
protected int getTextViewNameId() {
return R.id.tvName;
}
@NonNull
@Override
protected int getCheckBoxId() {
return R.id.checkbox;
}
@Override
protected RecyclerView.LayoutManager getInitialLayoutManager() {
return new GridLayoutManager(getContext(), 3);
}
@Override
protected void initView(View view) {
super.initView(view);
toolbar.inflateMenu(R.menu.menu_custom_dialog);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.actionDone:
doneSelecting();//supported function to passed result to listener
break;
case R.id.actionList:
changeLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
break;
case R.id.actionGrid:
changeLayoutManager(new GridLayoutManager(getContext(), 3));
break;
}
return false;
}
});
}
public static MyExampleCustomDialog newInstance(FilePickerDialogFragment.OnFilesSelectedListener onFilesSelectedListener, DialogConfig dialogConfig) {
MyExampleCustomDialog myExampleCustomDialog = new MyExampleCustomDialog();
myExampleCustomDialog.onFilesSelectedListener = onFilesSelectedListener;
myExampleCustomDialog.dialogConfig = dialogConfig;
return myExampleCustomDialog;
}
}
If I have free time, I will make this dialog more customizable:
- Customizable dialog theme
- Customizable dialog UI (recycler view's row, button, toolbar...)
Feel free to create an issue if you had any problem.
Copyright 2017 Doan Hong Phuoc
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.