Страница 1 из 1

непонятки с RingtonePreference

Добавлено: 13 мар 2012, 13:01
_saper_
здравствуйте.
помогите пожалуйста решить такую проблему.
в моем PreferenceActivity есть RingtonePreference и вся беда в том, что он не вызывает свой onPreferenceChange после выбора рингтона.

полазил я по StackOverflow, пишут что это стандартная бага android

скачал я исходники lithium-alarming, там у него создан свой клас, унаследованый от rintonepreference
скомпилил его исходники-всё работает

скопировал всё себе, буквально уже точь в точь- не вызывает всеровно :(
уже в своем RingtonePref переопределил onActivityResult и всунул в корень команду записи в лог. Даже onActivityResult не вызывается!

самое главное у него то всё работает!

xml этого RingtonePref

Код: Выделить всё

        <ui.app.RingtonePref
            android:key="@string/key_notif_ringtone"
            android:ringtoneType="alarm"
            android:showDefault="false"
            android:showSilent="false"
            android:title="@string/notif_ringtone" />
сам RingtonePref

Код: Выделить всё

/**
*
*/
package ui.app;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.preference.RingtonePreference;
import android.util.AttributeSet;

public class RingtonePref extends RingtonePreference {

    public Uri mAlert;
    private IRingtoneChangedListener mRingtoneChangedListener;

    public interface IRingtoneChangedListener {
        public void onRingtoneChanged(Uri ringtoneUri);
    };

    public RingtonePref(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setRingtoneChangedListener(IRingtoneChangedListener listener) {
        mRingtoneChangedListener = listener;
    }

    @Override
    protected void onSaveRingtone(Uri ringtoneUri) {
        LogManager.v("И тут естественно");
        if (ringtoneUri != null) {
            mAlert = ringtoneUri;
            if (mRingtoneChangedListener != null) {
                mRingtoneChangedListener.onRingtoneChanged(ringtoneUri);
            }
        }
    }

    @Override
    protected Uri onRestoreRingtone() {
        return mAlert;
    }

    @Override
    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
        LogManager.v("Даже это не вызывается");
        return super.onActivityResult(requestCode, resultCode, data);
    }
    
    
    

}
в активити

Код: Выделить всё

/**
*
*/
package ui.app;

import sumy.sneg.ShiftsAndGraffsManager.GraffColumns;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;

/**
*
*
*/
public class PreferenceAct extends PreferenceActivity {


    CheckBoxPreference show_icons;    
    CheckBoxPreference disable_all_notif_pref;
    CheckBoxPreference vibra_enabled;
    RingtonePref ringtone;
    

    
    private class RingtoneChangedListener implements RingtonePref.IRingtoneChangedListener {
        public void onRingtoneChanged(Uri ringtoneUri) {
            
            LogManager.v("Вызывается онЧенж");
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.main_pereference);
        
        

        ringtone = (RingtonePref) findPreference(getResources().getString(R.string.key_notif_ringtone));

        UpdateOnStart();


        ringtone.setRingtoneChangedListener(new RingtoneChangedListener());
        show_icons
                .setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

                    public boolean onPreferenceChange(Preference preference,
                            Object newValue) {

                        if (newValue instanceof Boolean) {
                            UpdateShowIcons((Boolean) newValue);
                        }
                        return true;
                    }
                });


    }



    

    private void UpdateOnStart() {

        
        String sound=settings.getString(ringtone.getKey(),null);
        if (sound == null || sound.length() == 0) {
            if (LogManager.DEBUG) LogManager.v("****** reportAlarm null or 0-length alert");
            ringtone.mAlert = getDefaultAlarm();
            if (ringtone.mAlert == null) {
                LogManager.e("****** Default Alarm null");
            }
        } else {
            ringtone.mAlert = Uri.parse(sound);
            if (ringtone.mAlert == null) {
                LogManager.e("****** Parsed null alarm. URI: " + sound);
            }
        }
        if (LogManager.DEBUG) LogManager.v("****** reportAlarm uri " + sound + " alert " +ringtone.mAlert);
        
        UpdateRingtone(ringtone.mAlert);

    }
    

    private void UpdateRingtone(Uri uri) {
        if(uri!=null){
        editor.putString(ringtone.getKey(), uri.toString());
        editor.commit();
        }
        if (LogManager.DEBUG) LogManager.v("updateMelody to -" + uri+"-");
        Ringtone globalringtone = RingtoneManager.getRingtone(this, uri);
        if (globalringtone != null) {
            String title=globalringtone.getTitle(this);
            if (LogManager.DEBUG) LogManager.v("updateMelody to" + title);
            ringtone.setSummary(title);
        }

    }
    



    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {

        if (preference == get_shift_screen) {
            Intent i = new Intent(new Intent(this, GraffListPreviewAct.class));
            i.putExtra("request", MANAGE_GRAFF);
            startActivityForResult(i, MANAGE_GRAFF);

        }
        if (preference == show_graff_screen) {
            Intent i = new Intent(new Intent(this, GraffListPreviewAct.class));
            i.putExtra("request", SHOW_GRAFF);
            startActivityForResult(i, SHOW_GRAFF);

        }

        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }



}
поудалял всё лишнее чтобы не мешало

может я что-то упустил?
есть хоть какието соображения?

Re: непонятки с RingtonePreference

Добавлено: 14 мар 2012, 15:49
KamiSempai
Может в манифесте чего не хватает?

Re: непонятки с RingtonePreference

Добавлено: 14 мар 2012, 19:37
_saper_
KamiSempai,
спасибо хоть за какой-то ответ, а то у меня впечатление, что я в вакууме :D

в манифесте ничего такого, одни ресейверы, да активити без параметров

я уже не знаю что предположить :shock:

Re: непонятки с RingtonePreference

Добавлено: 15 мар 2012, 20:41
_saper_
проблема решилась использованием кастомного ringtonepicker'a