Ringtonepreference根本不会触发任何内容

时间:2014-07-20 23:26:40

标签: java android preference ringtone preferencefragment

我将一个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) - &GT;活性1(的ActivityGroup) - &GT;活性2(活动) - &GT; PreferenceFragment

我没有写这段代码,但是在有人离开的地方发现了。单击每个首选项的对话框导致应用程序崩溃,因为它不喜欢Activity2的上下文。这是一个与ActivityGroup相关的问题,通过将每个首选项的上下文强制转换为Activity1的上下文来解决。

EditPreferences,ListPreferences和CheckPreferences都按预期工作,但RingtonePreference给我带来了很多麻烦。虽然弹出对话框让我选择铃声,但它不会保存设置。

从列表中选择铃声并按OK按钮不会触发onPreferenceChange()或onSharedPreferenceChanged()。我尝试创建一个自定义的RingtonePreference并覆盖onSaveRingtone(),但根本没有被调用。然而,其他方法,如onPrepareRingtonePickerIntent()和onRestoreRingtone()确实被调用。我尝试了堆栈溢出时提到的一堆其他选项,但没有运气。我已经没有想法让RingtonePreference工作,并且认为使用RingtoneManager启动我自己的铃声选择器是最好的选择。如果有人能给我一些关于如何让RingtonePreference工作的建议,那就太棒了。

编辑:我认为这是一个背景问题,但我还不知道如何解决它。

2 个答案:

答案 0 :(得分:0)

我无法让RingtonePreference工作,但我确实找到了一些新的细节和替代品。 RingtonePreference看起来像是为对话框启动了一个新活动。如果你有launchmode = singleInstance,那将会搞乱RingtonePreference,因为你在另一个任务堆栈上启动该活动。使用launchmode = singleTask或删除launchmode可以解决你的问题,但不是完全适合我(但我仍然需要launchmode不等于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.
祝你好运!

答案 1 :(得分:0)

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;
        }
    });