2016-05-28 2 views
0

Я хотел бы иметь общую операцию «Chooser» - одну, которая может быть снабжена абстрактным источником данных, извлекать данные из указанного источника, представлять данные в ListView и возвращать выбранный элемент назад к вызывающей деятельности. Что-то очень похоже на RingtonePickerActivity.Передача «источника данных» между действиями

Я не могу понять, как передать общий источник данных из одной активности в другую. Все, что я видел до сих пор в обмене данными между действиями, - это передача данных через дополнительные приложения Intent. Но для меня это, похоже, не работает, поскольку я не хочу предоставлять фактические данные. Я хочу передать ссылку на абстрактный источник данных, который может быть запрошен (в отличие от Cursor).

Тут я хотел бы подчеркнуть, что я хотел бы выбирающий быть агностиком фактического источника данных - абстрактный источник данных обеспечит методы как getNextItem, getItemName, getItemValue. Лучшие модели этого, о которых я могу думать, - это курсоры или итераторы - чисто абстрактные механизмы итерации по набору данных.

Поскольку все действия приложения размещены в одном процессе, это должно быть возможно? Одна вещь, которую я хочу , не хочу, чтобы, чтобы иметь глобальную переменную источника данных внутри моего приложения, по множеству причин (один из них является тем фактом, что я буду запускать несколько действий выбора с несколькими источниками данных) - я хочу для предоставления данных для запуска активности во время запуска.

Возможно ли это? Я ужасно ошибаюсь? Есть ли способ лучше?

ответ

1

Но это не работает для меня здесь, так как я не хочу предоставлять фактические данные - я хочу передать ссылку на абстрактный источник данных, который можно запросить (в отличие от курсора) ,

Проведите дополнительный или Uri, который идентифицирует абстрактный источник данных. Используйте эту информацию для запроса этого источника данных.

Например, предположим, что «абстрактный источник данных» является веб-сервисом. Ваша деятельность должна будет достаточно знать о веб-службе, чтобы знать, какие данные возвращаются, просто потому, что у этого действия должны быть правила отображения для этих данных (то есть, что показывать для строк в списке). Но, возможно, фактический URL-адрес веб-службы меняется. Передайте URL в качестве дополнительного, или как «данные» в Intent (через setData(Uri.parse(theUrlThatYouWant)). Ваша деятельность может использовать что-то вроде Модернизированный для извлечения данных в фоновом потоке и использовать результаты в списке.

Поскольку мы не знаю, что такое ваш «абстрактный источник данных», мы не можем с готовностью помочь вам в дальнейшем. В общем, то, что вы передаете активности, - это некоторый идентификатор, который позволяет активности искать источник данных. Что вы используете для вас идентификаторы, и для этого механизма поиска зависит от вас и может связать то, что такое «абстрактный источник данных».

У вас должен быть общий пользовательский интерфейс, заполненный произвольными источниками данных, но эти произвольные источники данных не могут быть переданы через a Intent, поскольку объекты Intent предназначены для передачи через границы процесса. Ваш основной выбор:

  1. Использовать наследование и полиморфизм. Имейте функцию абстрактного выбора, которая выполняет большую часть работы, с подклассами, которые могут получать данные с простыми идентификаторами.

  2. Используйте некоторый пользовательский интерфейс активности, например фрагмент, поскольку вы больше не ограничены структурами Intent и можете передавать все необходимое.

+0

Прошу прощения, если я не был достаточно ясен. Дело в том, что я хочу, чтобы активность «Chooser» получала данные, не зная, откуда она взялась. Курсор, вероятно, хороший пример - я хочу, чтобы активность могла извлекать данные из источника, ничего не зная об этом. Другая модель может быть абстрактным итератором - то, что вы можете задать для следующего элемента. – SergeyA

+0

@SergeyA: «Я хочу, чтобы активность могла извлекать данные из источника, ничего не зная об этом» - um, ну, «Курсор» не работает. «Курсор» * - это данные, и вы заявили, что не хотите передавать фактические данные. Чтобы получить «Курсор», вам нужно знать, как его получить. Это может быть имя базы данных и запрос, или это может быть «ContentProvider» 'Uri' и запрос. «Еще одна модель может быть абстрактным итератором - что-то, что вы можете задать для следующего элемента» - um, это не то, как работают итераторы, поскольку вы затем передаете данные. – CommonsWare

+0

Я попытался изменить вопрос для ясности. Дайте мне знать, если это имеет смысл или не имеет смысла :) – SergeyA

1

Я знаю только эти способы передачи данных по деятельности.

  1. Передача данных через намерение.

  2. Если ваши данные созданы внутри Сервиса, вы можете создать ServiceConnection в обоих действиях и получить доступ к своим данным из обоих методов getData() внутри службы. Данные

  3. сделать глобальные или временно глобальные (аннулирует ссылки, как только вы закончите с ним так, что память освобождается)

  4. Передайте некоторую форму обучения через намерение, чтобы новая активность может воссоздать то же самое данные. Если, например, ваши данные поступают от запроса к базе данных, вы можете передать запрос в виде строки в действие B. Затем действие B может выполнить этот запрос и получить те же данные.

Возможно, вы хотели бы пойти с этим в другом направлении. Например, что-то, что я использовал много раз, - это диалоговое окно выбора, а не операция выбора. Таким образом вы показываете свой выбор, не выходя из своей деятельности, и вы просто передаете данные в свой конструктор диалога. И вы можете настроить диалоговое окно на полноэкранный режим, чтобы он мог выглядеть так же, как действие для пользователя. Одной и той же целью может служить фрагмент.

+0

См. Мои комментарии к другому ответу. Я пытался сделать мое намерение более ясным. – SergeyA

+0

см. Обновленный ответ..может это поможет вам – Anonymous

+0

Диалог выбора - интересный вариант, спасибо! – SergeyA