рд╕рдВрднрд╡рддрдГ,
рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рддрд░рд╣, рджреВрд╕рд░реЗ рджрд┐рди рдореБрдЭреЗ рдЙрдирдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдлрд╝рд╛рдЗрд▓ рдЪрдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рд╢реБрд░реВ рдореЗрдВ
рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдРрд╕реА рдХреЛрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рдереА, рдореИрдВ
рдорд╣рд╛рди рдФрд░ рднрдпрд╛рдирдХ рд╣реЛ рдЧрдпрд╛ ред рдпрд╣ рдореБрдЭреЗ рдЕрдЬреАрдм рд▓рдЧрд╛, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдФрд░ рдШрд░реЗрд▓реВ рдордВрдЪреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ, рдХреЗрд╡рд▓ рддреАрди рдореБрдЦреНрдп рд╕реНрд░реЛрдд рд╣реИрдВ:
- рдПрдВрдбреНрд░реЙрдЗрдб рдлрд╛рдЗрд▓ рдбрд╛рдпрд▓реЙрдЧ - рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рд▓реАрдб рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рд▓рд┐рдВрдХ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ .Net рд╕реЗ рдУрдкрдирдлрд╛рдЗрд▓рдбрд╛рдпрд▓реЙрдЧ рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рдХреБрдЫ рдЪрд╛рд╣рддрд╛ рдерд╛ред
- рдпрд╣ рд▓реЗрдЦ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред
- рдпрд╣рд╛рдБ рд╕реЗ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рдкрд╕рдВрдж рдЖрдпрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рдФрд░ рд╕реБрдВрджрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдирддреАрдЬрддрди, рдЕрдкрдиреЗ рдлреИрд╕рд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреБрдЫ рдореБрд╢реНрдХрд┐рд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдЬреЛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рднреА рдХрджрдо рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рд╣реБрдПред рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ -
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИ! рдХрд┐рд╕реА рднреА рдкрд░рд┐рдЪрд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ (рдореИрдВ
IntelliJ IDEA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВред рдореБрдЦреНрдп
рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд░ , рд╣рдо рдПрдХ рд╕рд┐рдВрдЧрд▓ рдмрдЯрди рд░рдЦреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рдЦрд╛рд▓реА рд╣реИ, рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░:
public void OnOpenFileClick(View view) { }
рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
import android.app.AlertDialog; import android.content.Context; public class OpenFileDialog extends AlertDialog.Builder { public OpenFileDialog(Context context) { super(context); setPositiveButton(android.R.string.ok, null) .setNegativeButton(android.R.string.cancel, null); } }
рдФрд░ рдмрдЯрди рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣рдо рд╕рдВрд╡рд╛рдж рдХрд╣рддреЗ рд╣реИрдВ:
OpenFileDialog fileDialog = new OpenFileDialog(this); fileDialog.show();
рдмрдЯрди рджрд┐рдЦрд╛рдИ рджрд┐рдП, рдЕрдм рд╣рдореЗрдВ рдЦреБрдж рдлрд╛рдЗрд▓реЗрдВ рдвреВрдВрдврдиреА рдереАрдВред рд╣рдо рд░реВрдЯ
sdcard рдХреЗ рд╕рд╛рде рдЦреЛрдЬ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
private String currentPath = Environment.getExternalStorageDirectory().getPath();
рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
private String[] getFiles(String directoryPath){ File directory = new File(directoryPath); File[] files = directory.listFiles(); String[] result = new String[files.length]; for (int i = 0; i < files.length; i++) { result[i] = files[i].getName(); } return result; }
(рдЪреВрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╕рд╛рде рддреБрд░рдВрдд рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдХрд┐рд╕реА рднреА
Google- рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдореЗрдВ рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛), рдФрд░ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╣рдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
редрд╕реЗрдЯ рдЗрдЯреНрд╕ (getFiles) currentPath), null) ред
рдареАрдХ рд╣реИ, рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╛рдЗрд▓реЗрдВ рд╕реЙрд░реНрдЯ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП
рдПрдбреЙрдкреНрдЯрд░ рдХреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рд╕реЗрдЯ рдХреА рдЬрдЧрд╣ рд▓реЗ
рд▓реЗрдВрдЧреЗред private class FileAdapter extends ArrayAdapter<File> { public FileAdapter(Context context, List<File> files) { super(context, android.R.layout.simple_list_item_1, files); } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView view = (TextView) super.getView(position, convertView, parent); File file = getItem(position); view.setText(file.getName()); return view; } }
.setAdapter(new FileAdapter(context, getFiles(currentPath)), null)
private List<File> getFiles(String directoryPath){ File directory = new File(directoryPath); List<File> fileList = Arrays.asList(directory.listFiles()); Collections.sort(fileList, new Comparator<File>() { @Override public int compare(File file, File file2) { if (file.isDirectory() && file2.isFile()) return -1; else if (file.isFile() && file2.isDirectory()) return 1; else return file.getPath().compareTo(file2.getPath()); } }); return fileList; }
рдФрд░ рднреА рдмреЗрд╣рддрд░, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЕрдВрджрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реВрдЪреА рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ (рдпрд╣ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧрд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рд▓рд┐рд╕реНрдЯрд╡реНрдпреВ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░
рдПрдбреЙрдкреНрдЯрд░ рдХреЗ рдмрджрд▓рд╛рд╡ рдиреЗ рдПрдХ
рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛, рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдкрдбрд╝рд╛:
private List<File> files = new ArrayList<File>(); public OpenFileDialog(Context context) { super(context); files.addAll(getFiles(currentPath)); ListView listView = createListView(context); listView.setAdapter(new FileAdapter(context, files)); setView(listView) .setPositiveButton(android.R.string.ok, null) .setNegativeButton(android.R.string.cancel, null); } private void RebuildFiles(ArrayAdapter<File> adapter) { files.clear(); files.addAll(getFiles(currentPath)); adapter.notifyDataSetChanged(); } private ListView createListView(Context context) { ListView listView = new ListView(context); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int index, long l) { final ArrayAdapter<File> adapter = (FileAdapter) adapterView.getAdapter(); File file = adapter.getItem(index); if (file.isDirectory()) { currentPath = file.getPath(); RebuildFiles(adapter); } } }); return listView; }
рдЦреИрд░,
рдПрдВрдбреНрд░реЙрдЗрдб рдлреЛрд▓реНрдбрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ
рдбреЗрдЯрд╛ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рд╣рдорд╛рд░реА рд╡рд┐рдВрдбреЛ рддреБрд░рдВрдд рдЖрдХрд╛рд░ рдореЗрдВ рдШрдЯ рдЬрд╛рддреА рд╣реИред
рд╢рд╛рдпрдж рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рдерд╛, рдФрд░ рдореИрдВрдиреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреАред рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓рд╛ рд╣реИ рд╡рд╣ рд╣реИ
рд╕реЗрдЯрдорд┐рдирд┐рдорд╣рд╛рдЗрдЯ ред
рд▓рд┐рд╕реНрдЯрд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реБрдИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ
рд▓рд┐рдирд┐рдпрд░ рд▓рд╛рдИрдЯ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:
public OpenFileDialog(Context context) { super(context); LinearLayout linearLayout = createMainLayout(context); files.addAll(getFiles(currentPath)); ListView listView = createListView(context); listView.setAdapter(new FileAdapter(context, files)); linearLayout.addView(listView); setView(linearLayout) .setPositiveButton(android.R.string.ok, null) .setNegativeButton(android.R.string.cancel, null); } private LinearLayout createMainLayout(Context context) { LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setMinimumHeight(750); return linearLayout; }
рдкрд░рд┐рдгрд╛рдо, рд╡реИрд╕реЗ рднреА, рдЬрд┐рддрдирд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдирд┐рдХрд▓рд╛: рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕рдВрд╡рд╛рдж рдХреЛ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░
Android рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдШрдЯрдХрд░
750px рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реНрдХреНрд░реАрди рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдКрдВрдЪрд╛рдЗрдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВред рд╣рдо рд╡рд░реНрддрдорд╛рди рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡
рд╕реЗрдЯрд┐рдорд┐рдирд╣рд╛рдЗрдЯ рд╕реЗрдЯ
рдХрд░рдХреЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдЗрди рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдВрдЧреЗ:
private static Display getDefaultDisplay(Context context) { return ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); } private static Point getScreenSize(Context context) { Point screeSize = new Point(); getDefaultDisplay(context).getSize(screeSize); return screeSize; } private static int getLinearLayoutMinHeight(Context context) { return getScreenSize(context).y; } private LinearLayout createMainLayout(Context context) { LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setMinimumHeight(getLinearLayoutMinHeight(context)); return linearLayout; }
рдбрд░рдиреЗ рдХреА рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрдХреНрд░реАрди рдХрд╛ рдкреВрд░рд╛ рдЖрдХрд╛рд░
рд╕реЗрдЯрдорд┐рдирд╛рдЗрдорд╛рдЗрдЯ рдХреЛ
рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ , рд╕рд┐рд╕реНрдЯрдо рдЦреБрдж рд╣реА рдЕрдзрд┐рдХрддрдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рдореВрд▓реНрдп рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ред
рдЕрдм рд╕рдорд╕реНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдХрд┐ рд╡рд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИред рдкрд╣рд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдЖрд╕рд╛рди рд▓рдЧ рд░рд╣рд╛ рд╣реИ -
рд╢реАрд░реНрд╖рдХ рдорд╛рди рдХреЛ
рд╡рд░реНрддрдорд╛рдирдкрд╛рда рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдмрджрд▓рдиреЗ рдкрд░ рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВред рдПрдХ
рд╕реЗрдЯрдЯрд╛рдЗрдЯрд▓ (рдХрд░реЗрдВрдЯрдкреИрде) рдХреЙрд▓ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░
рд░реАрдмрд┐рд▓реНрдбрдлрд╛рдЗрд▓реНрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
рд╕рдм рдареАрдХ рд▓рдЧрдиреЗ рд▓рдЧрд╛ рд╣реИред рдЖрдЗрдП
Android рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдВ:
рд▓реЗрдХрд┐рди рдирд╣реАрдВ - рд╢реАрд░реНрд╖рдХ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред
рд╕реЗрдЯрдЯрд╛рдЗрдЯрд▓ рдбрд╛рдпрд▓реЙрдЧ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛, рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рд╕рд╛рдЗрд▓реЗрдВрдЯ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣реЗрдбрд░ рдмрдирд╛рдХрд░ рдФрд░ рдЗрд╕реЗ рдорд╛рдирдХ рдПрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓рдХрд░ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
private TextView title; public OpenFileDialog(Context context) { super(context); title = createTitle(context); LinearLayout linearLayout = createMainLayout(context); files.addAll(getFiles(currentPath)); ListView listView = createListView(context); listView.setAdapter(new FileAdapter(context, files)); linearLayout.addView(listView); setCustomTitle(title) .setView(linearLayout) .setPositiveButton(android.R.string.ok, null) .setNegativeButton(android.R.string.cancel, null); } private int getItemHeight(Context context) { TypedValue value = new TypedValue(); DisplayMetrics metrics = new DisplayMetrics(); context.getTheme().resolveAttribute(android.R.attr.rowHeight, value, true); getDefaultDisplay(context).getMetrics(metrics); return (int)TypedValue.complexToDimension(value.data, metrics); } private TextView createTitle(Context context) { TextView textView = new TextView(context); textView.setTextAppearance(context, android.R.style.TextAppearance_DeviceDefault_DialogWindowTitle); int itemHeight = getItemHeight(context); textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeight)); textView.setMinHeight(itemHeight); textView.setGravity(Gravity.CENTER_VERTICAL); textView.setPadding(15, 0, 0, 0); textView.setText(currentPath); return textView; } private void RebuildFiles(ArrayAdapter<File> adapter) { files.clear(); files.addAll(getFiles(currentPath)); adapter.notifyDataSetChanged(); title.setText(currentPath); }
рдФрд░ рдлрд┐рд░, рд╕рдм рдХреБрдЫ рдареАрдХ рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рдЖрдк рдмрд╣реБрдд рджреВрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд▓рд╛рдЗрди рд╣реЗрдбрд░ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрдЧреА
SetMaximumWidth рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдПрдХ рд▓рдВрдмреЗ рдкрде рдХреА рд╢реБрд░реБрдЖрдд рджреЗрдЦреЗрдВрдЧреЗред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореЗрд░рд╛ рдирд┐рд░реНрдгрдп рдХрд┐рддрдирд╛ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛:
public int getTextWidth(String text, Paint paint) { Rect bounds = new Rect(); paint.getTextBounds(text, 0, text.length(), bounds); return bounds.left + bounds.width() + 80; } private void changeTitle() { String titleText = currentPath; int screenWidth = getScreenSize(getContext()).x; int maxWidth = (int) (screenWidth * 0.99); if (getTextWidth(titleText, title.getPaint()) > maxWidth) { while (getTextWidth("..." + titleText, title.getPaint()) > maxWidth) { int start = titleText.indexOf("/", 2); if (start > 0) titleText = titleText.substring(start); else titleText = titleText.substring(2); } title.setText("..." + titleText); } else { title.setText(titleText); } }
рдЕрдм рд╣рдо рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
рд▓рд┐рдирд┐рдпрд░рд▓реИрдЯ рд╣реИ ред рдЗрд╕рдореЗрдВ рдПрдХ рдФрд░
TextView рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд░рд┐рдлреИрдХреНрдЯ рдХрд░реЗрдВ:
private ListView listView; public OpenFileDialog(Context context) { super(context); title = createTitle(context); changeTitle(); LinearLayout linearLayout = createMainLayout(context); linearLayout.addView(createBackItem(context)); files.addAll(getFiles(currentPath)); listView = createListView(context); listView.setAdapter(new FileAdapter(context, files)); linearLayout.addView(listView); setCustomTitle(title) .setView(linearLayout) .setPositiveButton(android.R.string.ok, null) .setNegativeButton(android.R.string.cancel, null); } private TextView createTextView(Context context, int style) { TextView textView = new TextView(context); textView.setTextAppearance(context, style); int itemHeight = getItemHeight(context); textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeight)); textView.setMinHeight(itemHeight); textView.setGravity(Gravity.CENTER_VERTICAL); textView.setPadding(15, 0, 0, 0); return textView; } private TextView createTitle(Context context) { TextView textView = createTextView(context, android.R.style.TextAppearance_DeviceDefault_DialogWindowTitle); return textView; } private TextView createBackItem(Context context) { TextView textView = createTextView(context, android.R.style.TextAppearance_DeviceDefault_Small); Drawable drawable = getContext().getResources().getDrawable(android.R.drawable.ic_menu_directions); drawable.setBounds(0, 0, 60, 60); textView.setCompoundDrawables(drawable, null, null, null); textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { File file = new File(currentPath); File parentDirectory = file.getParentFile(); if (parentDirectory != null) { currentPath = parentDirectory.getPath(); RebuildFiles(((FileAdapter) listView.getAdapter())); } } }); return textView; }

рдПрдХ рдХрджрдо рдкреАрдЫреЗ рдЬрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рддрдХ рд▓реЗ рдЬрд╛ рд╕рдХрддреА рд╣реИ рдЬрд┐рди рддрдХ рдкрд╣реБрдВрдЪ рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо
RebuildFiles рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ:
private void RebuildFiles(ArrayAdapter<File> adapter) { try{ List<File> fileList = getFiles(currentPath); files.clear(); files.addAll(fileList); adapter.notifyDataSetChanged(); changeTitle(); } catch (NullPointerException e){ Toast.makeText(getContext(), android.R.string.unknownName, Toast.LENGTH_SHORT).show(); } }
(рд╕рдВрджреЗрд╢ рдЕрдм рддрдХ рдмрд╣реБрдд рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд▓реНрдж рд╣реА рд╣рдо рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ)ред
рдХреЛрдИ рднреА
OpenFileDialog рдмрд┐рдирд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ:
private FilenameFilter filenameFilter; public OpenFileDialog setFilter(final String filter) { filenameFilter = new FilenameFilter() { @Override public boolean accept(File file, String fileName) { File tempFile = new File(String.format("%s/%s", file.getPath(), fileName)); if (tempFile.isFile()) return tempFile.getName().matches(filter); return true; } }; return this; }
List<File> fileList = Arrays.asList(directory.listFiles(filenameFilter));
new OpenFileDialog(this).setFilter(".*\\.txt");
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрдпрди рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрдзрд╛рд░рд┐рдд
рд╢реЛ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ:
public OpenFileDialog(Context context) { super(context); title = createTitle(context); changeTitle(); LinearLayout linearLayout = createMainLayout(context); linearLayout.addView(createBackItem(context)); listView = createListView(context); linearLayout.addView(listView); setCustomTitle(title) .setView(linearLayout) .setPositiveButton(android.R.string.ok, null) .setNegativeButton(android.R.string.cancel, null); } @Override public AlertDialog show() { files.addAll(getFiles(currentPath)); listView.setAdapter(new FileAdapter(getContext(), files)); return super.show(); }
рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд░рд╣рддрд╛ рд╣реИ: рдЪрдпрдирд┐рдд рдлрд╝рд╛рдЗрд▓ рд▓реМрдЯрд╛рдПрдВред рдлрд┐рд░ рд╕реЗ, рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ
CHOICE_MODE_SINGLE рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рдлрд┐рд░ рднреА рдЪрдпрдирд┐рдд рдЖрдЗрдЯрдо рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдЬрдм рд╡рд╣ (рдХреЛрдб)
CHOICE_MODE_SINGLE рдХреЗ рдмрд┐рдирд╛
рд╡реИрд╕реЗ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
private int selectedIndex = -1;
@Override public View getView(int position, View convertView, ViewGroup parent) { TextView view = (TextView) super.getView(position, convertView, parent); File file = getItem(position); view.setText(file.getName()); if (selectedIndex == position) view.setBackgroundColor(getContext().getResources().getColor(android.R.color.holo_blue_light)); else view.setBackgroundColor(getContext().getResources().getColor(android.R.color.background_dark)); return view; }
private void RebuildFiles(ArrayAdapter<File> adapter) { try{ List<File> fileList = getFiles(currentPath); files.clear(); selectedIndex = -1; files.addAll(fileList); adapter.notifyDataSetChanged(); changeTitle(); } catch (NullPointerException e){ Toast.makeText(getContext(), android.R.string.unknownName, Toast.LENGTH_SHORT).show(); } } private ListView createListView(Context context) { ListView listView = new ListView(context); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int index, long l) { final ArrayAdapter<File> adapter = (FileAdapter) adapterView.getAdapter(); File file = adapter.getItem(index); if (file.isDirectory()) { currentPath = file.getPath(); RebuildFiles(adapter); } else { if (index != selectedIndex) selectedIndex = index; else selectedIndex = -1; adapter.notifyDataSetChanged(); } } }); return listView; }
рдФрд░ рдПрдХ рд╢реНрд░реЛрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдБ:
public interface OpenDialogListener{ public void OnSelectedFile(String fileName); } private OpenDialogListener listener; public OpenFileDialog setOpenDialogListener(OpenDialogListener listener) { this.listener = listener; return this; }
тАж .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (selectedIndex > -1 && listener != null) { listener.OnSelectedFile(listView.getItemAtPosition(selectedIndex).toString()); } } }) тАж
рдЕрдЪреНрдЫрд╛, рдЪрд▓реЛ рдХреЙрд▓ рдмрджрд▓реЗрдВ:
OpenFileDialog fileDialog = new OpenFileDialog(this) .setFilter(".*\\.csv") .setOpenDialogListener(new OpenFileDialog.OpenDialogListener() { @Override public void OnSelectedFile(String fileName) { Toast.makeText(getApplicationContext(), fileName, Toast.LENGTH_LONG).show(); } }); fileDialog.show();
рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рд╕реБрдзрд╛рд░:
private Drawable folderIcon; private Drawable fileIcon; private String accessDeniedMessage; public OpenFileDialog setFolderIcon(Drawable drawable){ this.folderIcon = drawable; return this; } public OpenFileDialog setFileIcon(Drawable drawable){ this.fileIcon = drawable; return this; } public OpenFileDialog setAccessDeniedMessage(String message) { this.accessDeniedMessage = message; return this; } private void RebuildFiles(ArrayAdapter<File> adapter) { try{ List<File> fileList = getFiles(currentPath); files.clear(); selectedIndex = -1; files.addAll(fileList); adapter.notifyDataSetChanged(); changeTitle(); } catch (NullPointerException e){ String message = getContext().getResources().getString(android.R.string.unknownName); if (!accessDeniedMessage.equals("")) message = accessDeniedMessage; Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show(); } }
@Override public View getView(int position, View convertView, ViewGroup parent) { TextView view = (TextView) super.getView(position, convertView, parent); File file = getItem(position); view.setText(file.getName()); if (file.isDirectory()) { setDrawable(view, folderIcon); } else { setDrawable(view, fileIcon); if (selectedIndex == position) view.setBackgroundColor(getContext().getResources().getColor(android.R.color.holo_blue_dark)); else view.setBackgroundColor(getContext().getResources().getColor(android.R.color.transparent)); } return view; } private void setDrawable(TextView view, Drawable drawable) { if (view != null){ if (drawable != null){ drawable.setBounds(0, 0, 60, 60); view.setCompoundDrawables(drawable, null, null, null); } else { view.setCompoundDrawables(null, null, null, null); } } }
рдРрд╕реА рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореИрдВ рдЕрднреА рднреА рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдХрд┐рд╕реА рднреА рдорджрдж рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛:
- рдЖрдЗрдЯрдо "рдКрдкрд░" рдкрд░ рдХреНрд▓рд┐рдХ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛ред рдпрд╣ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдорд╛рди рдХреЗ рд▓рд┐рдП setBackgroundResource рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд▓рдЧрддрд╛ рд╣реИред рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдпреЛрдЧреНрдп редрд╕реВрдЪреА_рд╕реЗрд▓реЗрдХреНрдЯрд░_рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб , рд▓реЗрдХрд┐рди рдпрд╣ рдПрдВрдбреНрд░реЙрдпрдб 2.x рдХреА рд╢реИрд▓реА рд╣реИ, рди рдХрд┐ рд╣реЛрд▓реЛ !
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рд╡рд┐рд╖рдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдЪрдпрди рдХрд╛ рд░рдВрдЧред
рдореИрдВ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реВрдВред
рдпрд╣рд╛рдВ рдкреВрд░рд╛ рдХреЛрдбред