Java Ringtonepreference根本不会触发任何内容

Java Ringtonepreference根本不会触发任何内容,java,android,preference,ringtone,preferencefragment,Java,Android,Preference,Ringtone,Preferencefragment,我在2 PreferenceScreen中嵌套了一个RingtonePreference,声明为: <PreferenceScreen //other preferences <PreferenceScreen //other preferences <RingtonePreference android:key="ringtone"

我在2 PreferenceScreen中嵌套了一个RingtonePreference,声明为:

<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)->首选片段

我并没有写这段代码,但我会从别人留下的地方开始。由于不喜欢Activity2的上下文,单击每个首选项的对话框都会使应用程序崩溃。这是一个与ActivityGroup相关的问题,通过将每个首选项的上下文强制转换为Activity1的上下文来解决

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

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


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

我无法让RingtonePreference正常工作,但我确实找到了一些新的细节和替代方案。RingtonePreference看起来好像启动了对话框的新活动。如果您的launchmode=singleInstance,这将打乱RingToneReference,因为您在不同的任务堆栈上启动该活动。使用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.

祝你好运

kyrax的答案似乎很合适,尽管我不想经历所有以编程方式创建首选项然后以这种方式插入的麻烦

为了解决这个问题,我从一个完整的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;
        }
    });

我不再使用相同的代码库,但onPreferenceChange()没有被调用。谢谢你的帖子,我希望你的回答能帮助别人。