Как мы контролируем настройку адаптера синхронизации Android?
В попытке написать собственный адаптер синхронизации Android я следовал этому. Мне удалось показать запись (настройки учетной записи) в общих настройках со следующим фрагментом кода из приведенного выше примера.
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="General Settings" />
<PreferenceScreen android:key="account_settings"
android:title="Account Settings" android:summary="Sync frequency, notifications, etc.">
<intent android:action="fm.last.android.activity.Preferences.ACCOUNT_SETUP"
android:targetPackage="fm.last.android"
android:targetClass="fm.last.android.activity.Preferences" />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>
Код привел мне запись (Настройки аккаунта) в общих настройках:
При нажатии на " Настройки учетной записи" я получаю сообщение об ошибке следующим образом, и устройство перезагружается без необходимости.
ОШИБКА /AndroidRuntime(30057): android.util.AndroidRuntimeException: вызов startActivity() вне контекста Activity требует флага FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите?
Я знаю, что эту ошибку можно решить с помощью кода. Поскольку предпочтение "Настройки учетной записи" - это код на основе XML, я застрял с ошибкой.
Кто-нибудь может помочь решить проблему?
Как мы контролируем такого рода предпочтения с помощью кода?
2 ответа
Я не буду точно отвечать на ваши 2 вопроса, но я решил эту проблему, обойдя ее, выполнив следующие 3 шага:
- Настройка учетных записей XML
- Создать действие для управления настройками
- Извлечь информацию об учетной записи из намерения "редактирование предпочтений"
Настройка параметров учетной записи XML
Я использовал account_preferences.xml, очень похожий на тот, что в образце SDK и приложение c99 Last.fm. Рассмотрим следующий фрагмент:
<PreferenceScreen
android:key="account_settings"
android:title="Account Preferences"
android:summary="Misc account preferences">
<intent
android:action="some.unique.action.name.account.EDIT"
android:targetPackage="com.example.preferences"
android:targetClass="com.example.preferences.PreferencesActivity">
</intent>
</PreferenceScreen>
Учитывая это, вот некоторые из важных моментов, которые я нашел: (Обратите внимание, что я нашел их с помощью экспериментов, а не с помощью какой-либо конкретной документации Android - если у будущих читателей этого вопроса есть эти ссылки, было бы здорово связать те в.)
- Ключ android: для этого PreferenceScreen должен быть "account_settings", иначе Android не найдет и не отобразит ваши настройки
- Используя явное намерение и указав targetPackage и targetClass, android запустит ваше действие напрямую, и вам не нужно беспокоиться о фильтре намерений.
- Android хранит объект "Учетная запись" для текущей выбранной учетной записи в "Дополнениях" этого намерения, что очень важно для принимающей стороны, чтобы вы могли знать, какой учетной записью вы управляете. Подробнее об этом ниже.
Создание предпочтения управления активностью
Затем я создал Activity для соответствия пакету и классу, указанному в приведенном выше XML. Обратите внимание, что, насколько я могу судить, выбор Activity зависит от вас - это наиболее распространенный вариант для подкласса android.preference.PreferenceActivity, но я также подклассифицировал Activity напрямую. Стандартные инструкции по развитию деятельности применяются здесь...
Получение учетной записи из намерения "редактирование предпочтений"
Когда ваша активность запускается, вы можете извлечь соответствующий объект Account из пакета Extras (используя this.getIntent(). GetExtras()) и ключ "account". Напомним, что это намерение будет тем, которое вы указали в XML-файле настроек изначально. (Опять же, я не смог найти документ по этому вопросу, поэтому нашел его, сбросив содержимое пакета Extras, переданного с моим намерением.) После того, как у вас есть учетная запись, будет просто загрузить / сохранить настройки для этой учетной записи с помощью SharedPreferences, ваш базы данных, или любой другой метод, который вы предпочитаете.
Надеюсь, это поможет...
Файлы / ресурсы, упомянутые выше в, не находятся в отдельном пакете: это единственное, что автор забыл адаптировать, я думаю: вы должны создать свой собственный класс предпочтений. вот мой класс:
public class AccountPreferences extends PreferenceActivity {
public static final String TAG = "AccountPreferences";
private boolean shouldForceSync = false;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Log.i(TAG, "onCreate");
addPreferencesFromResource(R.xml.preferences_resources);
@Override
public void onPause() {
super.onPause();
if (shouldForceSync) {
AccountAuthenticatorService.resyncAccount(this);
}
}
Preference.OnPreferenceChangeListener syncToggle = new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
shouldForceSync = true;
return true;
}
};
и вот файл настроек: Предпочтения_resources.xml
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/privacy_preferences">
<CheckBoxPreference
android:key="privacy_contacts"
android:defaultValue="true"
android:summary="@string/privacy_contacts_summary" android:title="@string/privacy_contacts_title"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/outgoing_preferences">
<CheckBoxPreference
android:key="allow_mail"
android:defaultValue="true"
android:summary="@string/allow_mail" android:title="@string/allow_mail_text"/>
</PreferenceCategory>
вам придется адаптировать их или взглянуть глубже на файлы в его проекте last.fm.
Надеюсь это поможет. Удачи.