3

我有一个 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 工作的建议,那就太好了。

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

4

2 回答 2

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.

祝你好运!

于 2014-07-31T18:18:37.217 回答
0

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;
        }
    });
于 2016-01-14T17:00:47.873 回答