0

Я разрабатываю модуль Android, который в основном состоит из пользовательских представлений. Третьи стороны могут просто перейти к любой из своих действий. Этот модуль включает в себя конфигурацию (на основе PreferenceActivity).Обратный вызов активности Android для Android

Учитывая, что вы не можете начать активность из представления, модуль вызывает «openConfig (намерение намерения)» в действии, в котором он отображается. Это действие действует как делегат для модуля.

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

Я думал о простом добавлении основного класса модуля в качестве делегата к активности предпочтений;

ConfigActivity a = new ConfigActivity(); 
a.testVar = "testtest"; 
Intent intent = new Intent(getContext(), a.getClass()); 
delegate.handleConfigAction(intent); // 

Однако этот тест только с простой строкой (вместо интерфейса) показал, что строка не будет получить набор после начала деятельности.

Вторая мысль заключалась в том, чтобы использовать 'putExtra()' в намерении, но это действительно не подходит для использования, поскольку делегат, который я хотел бы разместить там, действительно представляет собой объект, а не сериализуемый объект данных.

Есть ли какие-либо способы для меня справиться с этим внутренне? Я знаю о функции onActivityResult() (http://developer.android.com/training/basics/intents/result.html), но это будет означать, что стороннему разработчику, использующему мой модуль, нужно будет справиться с этим, чего следует избегать по очевидным причинам.

Любая помощь была бы высоко оценена!

EDIT: окончательное решение В конце концов я изменил модуль с видом на фрагмент, который теперь работает намного лучше с обработкой «ребенок» деятельность и тому подобное. При запуске Activity from the Fragment функция onActivityResult прекрасно работает для выполнения поставленной задачи.

+1

«так, чтобы модуль получил уведомление, когда настройки были изменены» - почему бы не использовать [OnSharedPreferenceChangeListener] (http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener. HTML)? – CommonsWare

+0

Как бы я зарегистрировал этого слушателя? Я имею в виду, что PreferencesActivity начнет работу с представления, а не на активность. – AlBirdie

+1

Имея представление о запуске, деятельность представляет собой недостаток в дизайне, ИМХО. Тем не менее, нет ничего, что останавливало бы «Просмотр» от доступа к «SharedPreferences» и вызова 'setOnSharedPreferenceChangeListener()' перед тем, как запустить эту функцию «PreferenceActivity». – CommonsWare

ответ

1

Вы можете начать Activity из View, используя его Context как в:

@Override 
public void onClick() { 
    Intent intent = new Intent(getContext(), ConfigActivity.class); 
    intent.putExtra("testVar", "testtest"); 
    getContext().startActivity(intent); 
} 

Вы можете использовать метод onWindowVisibilityChanged() прочитать конфигурацию, которая будет устанавливать в ConfigActivity, чтобы сделать ваш View изменить свое поведение.

+0

Использование getContext() в представлении для начала нового действия работает хорошо. Спасибо за это. Тем не менее, я не могу использовать putExtra, поскольку мне нужно передать интерфейс, который реализует View. – AlBirdie

+0

Зачем вам нужно передавать 'View'? – Gorcyn

+0

Ну, мне нужен обратный вызов для представления. Существуют ли другие способы достижения этого? – AlBirdie

Смежные вопросы