2013-06-27 30 views
3

目前,我只是使用CheckBoxPreference來激活/停用聲音。聲音從原始資源播放。來自原始資源的自定義鈴聲的RingtonePreference

現在我想用RingtonePreference替換這個CheckBoxPreference,但是我的資源中的自定義聲音應該是默認的,並且可以從ringtonepreference中選擇。

我該怎麼做?

+0

見http://stackoverflow.com/a/31004356/909406 – almisoft

回答

2

我寫這適合我的需求偏好類,這裏也許這將幫助其他人:

public class SoundPreference extends ListPreference implements 
      PreferenceManager.OnActivityResultListener, OnPreferenceChangeListener { 

    private NotificationPrefs mAct; 

    public SoundPreference(NotificationPrefs act) { 
      super(act); 
      mAct = act; 
      setEntries(new String[] { "Silent", 
          "Custom", 
          "Picker" }); 
      setEntryValues(new String[] { "silent", "custom", "picker" }); 

      setOnPreferenceChangeListener(this); 
    } 

    @Override 
    public boolean onActivityResult(int requestCode, int resultCode, Intent data) { 
      if (data != null) { 
        Uri uri = data 
            .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 
        if (uri != null) { 
          persistString(uri.toString()); 
          return true; 
        } 
      } 
      return false; 
    } 

    @Override 
    public void setValue(String value) { 

      List<CharSequence> vals = new ArrayList<CharSequence>(
          Arrays.asList(getEntryValues())); 
      if (!vals.contains(value)) { 
        List<CharSequence> ents = new ArrayList<CharSequence>(
            Arrays.asList(getEntries())); 
        Ringtone r = RingtoneManager.getRingtone(getContext(), 
            Uri.parse(value)); 
        String name = r.getTitle(getContext()); 
        vals.add(value); 
        ents.add(name); 

        this.setEntries(ents.toArray(new CharSequence[ents.size()])); 
        this.setEntryValues(vals.toArray(new CharSequence[vals.size()])); 

      } 
      super.setValue(value); 
    } 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
      if ("picker".equals(newValue)) { 

        Intent i = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 
        i.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false); 
        i.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); 
        Intent chooserIntent = Intent.createChooser(i, getContext() 
            .getString(R.string.sound)); 
        mAct.startActivityForResult(chooserIntent, 0); 
        mAct.setActivityResultListener(this); 
        return false; 
      } 

      return true; 

    } 
} 
相關問題