Ringtonepreference вообще ничего не вызывает

У меня есть RingtonePreference, вложенный в 2 PreferenceScreen, объявленный как:

<PreferenceScreen
//other preferences
        <PreferenceScreen
        //other preferences
                <RingtonePreference
                    android:key="ringtone"
                    android:title="@string/ringtone_title"
                    android:summary="@string/sipringtone_ringtone_summary"
                    android:ringtoneType="ringtone"  />
        />
/>

PreferenceFragment как таковой вложен в ActivityGroup. Путь к фрагменту следующий: MainActivity(TabActivity)->Activity1(ActivityGroup)->Activity2(Activity)->PreferenceFragment

Я не писал этот код, но продолжаю с того места, где кто-то остановился. Диалоговые окна при выборе каждой настройки приводили к сбою приложения, потому что ему не нравился контекст Activity2. Это была проблема, связанная с ActivityGroup, которая была решена путем приведения контекста каждого предпочтения к контексту Activity1.

EditPreferences, ListPreferences и CheckPreferences работали как положено, но RingtonePreference доставляет мне много хлопот. Хотя диалоговое окно появляется, чтобы позволить мне выбрать мелодии звонка, оно не сохраняет настройки.

Выбор мелодии звонка из списка и нажатие кнопки OK не запускает onPreferenceChange() или onSharedPreferenceChanged(). Я попытался создать собственный RingtonePreference и переопределить onSaveRingtone(), но это вообще не вызывалось. Однако вызывались другие методы, такие как onPrepareRingtonePickerIntent() и onRestoreRingtone(). Я попробовал кучу других вариантов, которые упоминались при переполнении стека, но безуспешно. У меня заканчиваются идеи, чтобы заставить RingtonePreference работать, и я думаю, что запуск моего собственного средства выбора мелодии с помощью RingtoneManager — лучшая альтернатива. Если бы кто-нибудь мог дать мне несколько советов о том, как заставить RingtonePreference работать, это было бы здорово.

Изменить: я считаю, что это проблема контекста, но я пока не могу понять, как ее решить.


person kyrax    schedule 20.07.2014    source источник


Ответы (2)


Мне не удалось заставить RingtonePreference работать, но я нашел некоторые новые детали и альтернативу. RingtonePreference выглядит так, будто запускает новую активность для диалога. Если у вас есть launchmode=singleInstance, это испортит RingtonePreference, потому что вы запускаете это действие в другом стеке задач. Использование launchmode=singleTask или удаление режима запуска может решить вашу проблему, но не полностью для меня (но мне все же нужно, чтобы режим запуска не был равен singleInstance). Мое решение состояло в том, чтобы добавить предпочтение вручную в java-коде. Шаги были

1) Find your preference screen
2) Make a preference
3) Set your preference details, i.e. title & summary
4) (Optional) Arrange the order of your preference (google the setOrder function for preference)
5) Set the onPreferenceCLickerListener to the preference you created
6) Inside onPreferenceClick, Launch the ringtone picker dialog configured by RingtoneManager and start the activity from where ever you want.
7) Add the preference to your preference screen chosen in step 1.
8) On the activity/fragment where you started the ringtone picker, override on onActivityResult() and handle the chosen ringtone.

Удачи!

person kyrax    schedule 31.07.2014

ответ kyrax кажется подходящим, хотя я не хотел проходить через весь беспорядок создания Preference программным путем, а затем вставлять его таким образом.

Чтобы решить эту проблему, я начал с полного XML, а затем просто добавил OnPreferenceChangeListener в RingtonePreference. Это можно сделать из вашего PreferenceFragment:

    Preference notificationSoundPref = findPreference("ringtone);
    notificationSoundPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            // do what you need here
            return true;
        }
    });
person dekaru    schedule 14.01.2016
comment
У меня больше нет той же базы кода, но onPreferenceChange() не вызывался для меня. Спасибо за ваш пост, и я надеюсь, что ваш ответ поможет кому-то еще. - person kyrax; 15.01.2016