Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Worldmen
2 / 2 / 1
Регистрация: 31.08.2013
Сообщений: 198
Завершенные тесты: 1
#1

Получить имя файла из диалога выбора файла - Программирование Android

15.11.2015, 16:16. Просмотров 527. Ответов 10
Метки нет (Все метки)

Нашел класс диалога выбора файла:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
package com.stetsenko.openfiledialog;
 
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
 
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
/**
 * [url]http://habrahabr.ru/post/203884/[/url]
 */
public class OpenFileDialog extends AlertDialog.Builder{
    private String currentPath = Environment.getExternalStorageDirectory().getPath();
    private List<File> files = new ArrayList<File>();
    private TextView title;
    private ListView listView;
    private FilenameFilter filenameFilter;
    private int selectedIndex = -1;
    private OpenDialogListener listener;
    private Drawable folderIcon;
    private Drawable fileIcon;
    private String accessDeniedMessage;
 
    public interface OpenDialogListener {
        public void OnSelectedFile(String fileName);
    }
 
    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);
            if (view != null) {
                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);
                }
            }
        }
    }
 
    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, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (selectedIndex > -1 && listener != null) {
                            listener.OnSelectedFile(listView.getItemAtPosition(selectedIndex).toString());
                        }
                    }
                })
                .setNegativeButton(android.R.string.cancel, null);
    }
 
    @Override
    public AlertDialog show() {
        files.addAll(getFiles(currentPath));
        listView.setAdapter(new FileAdapter(getContext(), files));
        return super.show();
    }
 
    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;
    }
 
    public OpenFileDialog setOpenDialogListener(OpenDialogListener listener) {
        this.listener = listener;
        return this;
    }
 
    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 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;
    }
 
    private int getItemHeight(Context context) {
        TypedValue value = new TypedValue();
        DisplayMetrics metrics = new DisplayMetrics();
        context.getTheme().resolveAttribute(android.R.attr.listPreferredItemHeightSmall, value, true);
        getDefaultDisplay(context).getMetrics(metrics);
        return (int) TypedValue.complexToDimension(value.data, metrics);
    }
 
    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;
    }
 
    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);
        }
    }
 
    private List<File> getFiles(String directoryPath) {
        File directory = new File(directoryPath);
        List<File> fileList = Arrays.asList(directory.listFiles(filenameFilter));
        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 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();
        }
    }
 
    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;
    }
}

Вызываю его:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void SelectFile(){
        OpenFileDialog fileDialog = new OpenFileDialog(this)
                //.setFilter(".*\\.csv")
                .setOpenDialogListener(new OpenFileDialog.OpenDialogListener() {
                    @Override
                    public void OnSelectedFile(String fileName) {
                        FileImport = fileName;          // получаем выбранный файл
                        Toast.makeText(getApplicationContext(), fileName, Toast.LENGTH_LONG).show();
                    }
                });
        fileDialog.show();
        Log.d(LOG_TAG, "---- Имя файла FileImport = " + FileImport);
    }
Пробовал получить файл через переменную FileImport, но не получается. В нее попадает имя файла, если второй раз вызвать этот диалог. Как правильно получить имя файла?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2015, 16:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить имя файла из диалога выбора файла (Программирование Android):

Диалог выбора файла - Программирование Android
Темы на форуме по данному вопросу видел, но не решают проблему:) Что требуется: По кнопке выбрать любой файл и отправить на веб-сервер....

Диалог выбора файла - Программирование Android
обнаружил, что стандартного диалога не существует нашел такую реализацию https://github.com/Kaloer/Android-File-Picker-Activity 06-15...

Не работает обработчик выбора файла - Программирование Android
Снова пытаюсь разобраться с AIDE на мобиле. Проблема в том, что не отрабатывает метод onItemSelected. Там хочу прочитать файл, путь к нему...

Диалог выбора файла в Android - Программирование Android
Здравствуйте! Мне понадобилось реализовать диалог выбора файла для последующей загрузки в videoview. Нашел пример в инете, который...

Как открыть окно выбора файла - Программирование Android
Добрый вечер, ув. форумчане. Подскажите, как открыть окно выбора файла (чтобы пользователь выбрал путь к файлу) и считать его? Знаю что...

Поменять иконку и имя файла apk - Программирование Android
Хочу поменять иконку и имя файла apk. Где задать эти параметры?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Pablito
2474 / 1919 / 596
Регистрация: 12.05.2014
Сообщений: 6,747
Завершенные тесты: 1
16.11.2015, 12:33 #2
в чем прикол делать вот так FileImport = fileName; ? да еще и с большой буквы
у тебя вывод в лог стоит сразу после создания диалога, первый раз FileImport устественно будет пустой или null
Worldmen
2 / 2 / 1
Регистрация: 31.08.2013
Сообщений: 198
Завершенные тесты: 1
16.11.2015, 23:25  [ТС] #3
Цитата Сообщение от Паблито Посмотреть сообщение
у тебя вывод в лог стоит сразу после создания диалога, первый раз FileImport устественно будет пустой или null
Я его туда и поставил, потому что в переменной было пусто, а Toast выводил выбранный файл.

Добавлено через 34 минуты
Добавил в класс OpenFileDialog переменную:
public String selectedFileName;
присвоил ей выбранный файл:
selectedFileName = listView.getItemAtPosition(selectedIndex).toString();
Протрассировал код - так и не понял как поймать выбранный файл.
Worldmen
2 / 2 / 1
Регистрация: 31.08.2013
Сообщений: 198
Завершенные тесты: 1
19.11.2015, 15:38  [ТС] #4
Разве никто не использует диалоговые окна для выбора файла ?!
Pablito
2474 / 1919 / 596
Регистрация: 12.05.2014
Сообщений: 6,747
Завершенные тесты: 1
19.11.2015, 16:00 #5
я еще раз напишу - вывод в лог происходит СРАЗУ после показа диалога, строки выполняются дальше, ничего не останавливается после .show()
поэтому переменная на момент показа диалога null

перенеси Log туда, в диалог и ты увидишь что переменная хранит имя файла, а потом вместо Log можно вызывать метод в который передай имя в котором ты можешь сделать с этим именем все что угодно
Worldmen
2 / 2 / 1
Регистрация: 31.08.2013
Сообщений: 198
Завершенные тесты: 1
19.11.2015, 17:24  [ТС] #6
Цитата Сообщение от Паблито Посмотреть сообщение
перенеси Log туда, в диалог и ты увидишь что переменная хранит имя файла, а потом вместо Log можно вызывать метод в который передай имя в котором ты можешь сделать с этим именем все что угодно
Это я давно понял. Я не понял где можно создать переменную или метод, которым присваивалось это значение, т.к. диалог начинается и продолжается как понос.
Я не понимаю в какой точке программы можно определить что диалог закончен, что бы можно было передать переменную с файлом.
Там есть метод setPositiveButton у OpenFileDialog , если я правильно понял, он вызывается, если нажата кнопка "Ok". Только я не могу его правильно оформить, вторым параметром нужен объект OnClickListener
Java
1
2
3
4
5
EditText etNameFile = (EditText)findViewById(R.id.etNameFile);
etNameFile.setText(SelectedImportFile.filePath);
 
OpenFileDialog fileDialog = new OpenFileDialog(this)
                .setPositiveButton(etNameFile, ? )
Pablito
2474 / 1919 / 596
Регистрация: 12.05.2014
Сообщений: 6,747
Завершенные тесты: 1
19.11.2015, 17:29 #7
Java
1
2
3
4
5
6
        .setPositiveButton(etNameFile, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // тут все и делаем
            }
        });
Worldmen
2 / 2 / 1
Регистрация: 31.08.2013
Сообщений: 198
Завершенные тесты: 1
19.11.2015, 17:32  [ТС] #8
Неправильно думаю, там должен быть метод setButton, но его почему-то нет.
Pablito
2474 / 1919 / 596
Регистрация: 12.05.2014
Сообщений: 6,747
Завершенные тесты: 1
19.11.2015, 17:33 #9
а, ну ок
Worldmen
2 / 2 / 1
Регистрация: 31.08.2013
Сообщений: 198
Завершенные тесты: 1
19.11.2015, 17:48  [ТС] #10
В конструкторе, оказывается есть этот код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   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, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (selectedIndex > -1 && listener != null) {
                            listener.OnSelectedFile(listView.getItemAtPosition(selectedIndex).toString());
                            SelectedImportFile.filePath = listView.getItemAtPosition(selectedIndex).toString();
                        }
                    }
                })
                .setNegativeButton(android.R.string.cancel, null);
    }
Я создал класс со статическим полем и добавил в метод (выше):
Java
1
2
3
public class SelectedImportFile {
    public static String filePath;
}
Только когда вызывать это поле, если я не могу определить где и когда заканчивается диалог в вызываемом методе
Worldmen
2 / 2 / 1
Регистрация: 31.08.2013
Сообщений: 198
Завершенные тесты: 1
22.11.2015, 23:26  [ТС] #11
у меня так ничего и не получилось

Добавлено через 9 часов 13 минут
Попробовал перегружать методы:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Override
    protected void onStart(){
        super.onStart();
        TextView tvSelectedFile = (TextView)findViewById(R.id.tvSelectedFile);
        tvSelectedFile.setText(fileImport); // показваем выбранный файл
        Log.d(LOG_TAG, "---- выполнился onStart() ----- ");
    }
 
    @Override
    protected void onResume(){
        super.onResume();
        Log.d(LOG_TAG, "------- выполнился: onResume()");
        TextView tvSelectedFile = (TextView)findViewById(R.id.tvSelectedFile);
        tvSelectedFile.setText(fileImport); // показваем выбранный файл
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "------- выполнился: onStop()");
    }
Кроме onStart и onResume при первом появлении, потом ничего не выполнялось. Т.е. при последующем вызове диалогового окна, методы onStop() и onResume() не срабатывали. Они, что , при вызове диалогового окна по другому работают?
onCreate() – вызывается при первом создании Activity
onStart() – вызывается перед тем, как Activity будет видно пользователю
onResume() – вызывается перед тем как будет доступно для активности пользователя (взаимодействие)

onPause() – вызывается перед тем, как будет показано другое Activity
onStop() – вызывается когда Activity становится не видно пользователю
onDestroy() – вызывается перед тем, как Activity будет уничтожено
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2015, 23:26
Привет! Вот еще темы с ответами:

Получить информацию из диалога - Программирование Android
Всем привет! Есть в методе onCreate: new AlertDialog.Builder(this) .setView(R.layout.dialog_signin) ...

Как с ListFragment передать имя файла чтобы открыть его в другом Активити? - Программирование Android
Всем привет, я новичек! ломаю голову над такой задачей: Есть ListFragment со списком &quot;приборов&quot; мне надо при нажатии на нужный прибор...

Получить дескриптор файла - Программирование Android
Если wav файл лежит в assets, то я дескрипторы получаю так: mAssetManager = getAssets(); // получим идентификаторы звуков ...

Как получить данные из файла .properties - Программирование Android
Всем привет. У меня есть класс который не наследуется от Activity. (Это класс фабрика) Как можно открыть в нем InputStream для чтения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.11.2015, 23:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru