2013-01-18 31 views
7

Android'de çalışan bir geçiş tercihi almaya çalışıyorum, böylece tüm tercihleri ​​tıkladıklarında veya açıp kapatacakları durumlarda, farklı durumlarda araya girme ve işleme kabiliyetine sahip olabilirim. . Anahtar Tercihi - Üzerinde hemHariciHaritayuDeğiştir hem dePreferansAyrıştırma

Bu

Ben başarmak çalışıyorum budur: Kullanıcı etiketleri kapalı tercihleri ​​gider ve hiçbir etiketleri saklanır (yani: tag tercihi boştur) Kullanıcı etiketleri için tercihi açar, ve o zamandan beri hiçbir etiketler şu anda saklanır Kullanıcının etiketi bulması için bir etiket arama etkinliği başlatır. - iyi çalışıyor.

Etiket zaten varsa ve SADECE durumu değiştirirse, değeri normal olarak güncelleyin. - iyi çalışıyor

İşte benim sorunum: Tercihleri ​​tıklarlarsa ve zaten bir etiketi kaydedildiyse, durumu değiştirmeyin (etkin olup olmadığına bakılmaksızın veya devre dışı bırakılmışsa), etiket arama etkinliğini başlatın. - Bu işe yaramaz.

Şimdiye kadar bulduklarım, yukarıdaki son senaryoda, onPreferenceChanged öğesine bir çağrı alıp onPreferenceClicked öğesine yapılan bir çağrıyı ve ardından onPreferenceChanged öğesine yapılan bir sonraki çağrıyı almamdır. Bu benim sorunum gibi görünüyor. OnPreferenceChanged öğesine yapılan ilk çağrı, dinleyicimin SharedPreferences'ım üzerinde etkin olup olmadığını bildirmesini sağlar.

Eğer onPreferenceChanged için ilk çağrıyı almadıysam sorun olmazdı. Ben dinleyicileri

SwitchPreference tagPref = (SwitchPreference) findPreference(PreferencesConstants.PREFERENCE_TAG_ENABLED); 
    tagPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      Log.e("BLAH", "onPrefChanged....is it handled by OnClick?" + Boolean.toString(handledByClick)); 


      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); 

      boolean enabled = prefs.getBoolean(PreferencesConstants.PREFERENCE_TAG_ENABLED, false); 
      Log.e("BLAH", "value stored in prefs? " + Boolean.toString(enabled)); 
      if (newValue instanceof Boolean) { 
       enabled = (Boolean) newValue; 
      } 

      Log.e("BLAH", "New value? " + Boolean.toString(enabled)); 

      if (!handledByClick) { 
       if (enabled && (currentTag == null || currentTag.isEmpty())) { 
        Log.e("BLAH", "Enabled and CurrentTag empty!"); 
        Intent intent = new Intent(getActivity(), TagSearchActivity.class); 
        startActivityForResult(intent, 0); 

        return false; // always return false, we'll handle 
            // updating 
            // this value manually. 
       } else { 
        return true; 
       } 
      } 
      Log.e("BLAH", "returning false (AS IN WE HANDLED IT)."); 
      return false; 
     } 
    }); 

    tagPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { 

     @Override 
     public boolean onPreferenceClick(Preference preference) { 

      handledByClick = true; 
      Log.e("BLAH", "onprefClick"); 

      Intent intent = new Intent(getActivity(), TagSearchActivity.class); 
      startActivityForResult(intent, 0); 

      return true; 
     } 
    }); 

İşte kaydedilmiş bir etiketi ile çalıştırdıktan sonra, ilgili günlük çizgilerdir ayarlayarak ve tercih tıklayarak ediyorum nerede

İşte alakalı parçadır.

01-18 15:55:05.593: E/BLAH(13261): onPrefChanged....is it handled by OnClick?false 
01-18 15:55:05.593: E/BLAH(13261): value stored in prefs? true 
01-18 15:55:05.593: E/BLAH(13261): New value? false 
01-18 15:55:05.613: E/DifferentClass(13261): On Shared Preferences Changed - tagEnabled 
01-18 15:55:05.652: E/DifferentClass(13261): disabled TAG in cancelAlarmService 
01-18 15:55:05.662: E/AnotherClass(13261): Updating Feed List. Old Size: 33, New Size: 14 
01-18 15:55:05.682: E/BLAH(13261): onprefClick 
01-18 15:55:05.812: E/BLAH(13261): onPrefChanged....is it handled by OnClick?true 
01-18 15:55:05.812: E/BLAH(13261): value stored in prefs? false 
01-18 15:55:05.822: E/BLAH(13261): New value? false 
01-18 15:55:05.822: E/BLAH(13261): returning false (AS IN WE HANDLED IT). 

cevap

1

Daha fazla saat aradıktan sonra, bu durumda başkalarına yardımcı olacak birkaç gönderiye rastladım. How do I create one Preference with an EditTextPreference and a Togglebutton?

Bu çok detaylı bir cevap ve tercihlerini anlamada çok yararlıdır:

Bu seferki bana verilen benim sorunum seçti çözüm oldu. http://xgouchet.fr/android/index.php?article4/master-on-off-preferences-with-ice-cream-sandwich

Size hemen hemen aynı görünüm vermek ve yukarıdaki biri olarak hissedecek, ancak daha fazla çalışma gerektirir ve benim gereksinimleri nedeniyle benim için işe yaramaz:

ben rastladım diğer yayın bu biriydi .

+0

çok güzel yazı. Gösterdiğin için teşekkürler. Yine de istediğim gibi tercihleri ​​yine de özelleştirebilirsiniz. Son kontrol ettiğimde, özel tercihlerin bir android kütüphanesinde var olmaları durumunda bazı sorunları olduğunu unutmayın. ne ve neden olduğundan emin değilim. belki de en son ADT ve SDK’ya zaten sabittirler. –

+0

Ayrıca, fark ettim ki, yukarıda belirttiğim 2 bağlantıdan bir kısmını birleştirmeniz gereken anahtar tercihinin "doğru" görünümünü ve hissini elde etmek için. İlk bağlantı benim uygulamış olduğum şey olsa da, düzen dosyasının sadece bir başlık ve özet içermemesinden sonra fark ettim. Hem başlığa hem de özete ihtiyacım var. Gönderdiğim ikinci bağlantı, tam olarak bunu yapan çok güzel bir düzen dosyasına sahip. Hala birisinin bu bilgiye ihtiyacı olması durumunda, ayarlarımdaki diğer tercihlerle aynı şekilde görünmesini sağlamak için bir çift dolgu ve metin boyutunu değiştirmek zorunda kaldım. – forevercrashed

1

Var olmayan bir özellik hakkında soru soruyorsunuz.

Ancak, tercih etkinliği bir listView kullanıyor olduğundan, özelleştirmek ve işlemek için bazı hileler kullanabilirsiniz. this website, Özelleştirmeyle ilgili yaptım, this website. Ben bir listView eklemek için ne var sordum, ama bir tercih etkinliği aslında bir liste görünümünü kullanır bilmiyordum.

+0

Bağlantılar için teşekkürler ... saatlerce aradıktan sonra daha fazla Bu sorunun çoğaltılması SO'ya gönderildi. Bunu cevabın içine koyacağım, eğer birisi bu yazıya rastlarsa, uygun çözümü bulacaklardır. (Şaşırtıcı derecede kolay!) – forevercrashed

6

Şu an için aynı sorun üzerinde çalışıyorum ve bunun için iki yol gidebilirsin.Her olay için özel eylemler ile switchpreference uygulanması

:

  • forevercrashed iyi noktalara yaptı. Onları takip etmeye çalıştım ama benim için yapmadılar. Bahse girerim işe yarıyor ama daha kolay bir şekilde daha fazla işlevselliğe ihtiyacım vardı. Xgouchet (ikinci Bağlantı), özel yerleşimleri ve ölçümleri (yükseklik, genişlik, dolgu vb.) Kullanan Üstbilgiler ve özel xml düzenlerini kullanır. Otomatik oluşturulan düzende oluşturulan Google'ları değiştirmeden bir çözüme ihtiyacım vardı.

  • Süper kolay ve güçlü bir yol: Kendi SwitchPreference'u uygulayın! Sadece bir sınıf şöyle geçersiz/uygulamak ardından SwitchPreference genişletmek ve yapmak:

    public class AutoUploadSwitchPreference extends SwitchPreference { 
    public AutoUploadSwitchPreference(Context context) { 
        super(context); 
    } 
    public AutoUploadSwitchPreference(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    } 
    public AutoUploadSwitchPreference(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 
    
    @Override 
    protected void onClick() { 
        //super.onClick(); THIS IS THE IMPORTANT PART! 
    } 
    

onClick() geçersiz kılma ve dışarı yorum olarak/super.onClick() silme SwitchPreference DEĞİL çağrı callChangeListener(Object newValue) yapar. Artık tercihi tıklayabilir ve hiçbir şey gerçekleşene kadar hiçbir şey olmaz. Şimdi


(yoksa ortaya çıkabilecek bir hata fragmanında onPreferenceChange birden fazla çağrı başlamıştı)! Bir şeyler yapmak için: Kullandığım yapı burada. Bu olması gereken bir PreferenceFragment

  • başlatmak -

    • İçinde bir SettingsActivity
      • Eğer
    • onCreate() yılında Faaliyetinizdeki vb tercihleri, kaynakları getirmek emin olun oluştur özel sınıf PreferenceFragment'u genişletiyor, bkz. burada: PreferenceFragment
  • Özel Fragmanınızda, özel tercihinizi beklemeye alın. findPreference("custom_switch_key")'u kullanabilirsiniz.

    • şahsen benim parçası dinleyici uygulamak ve argüman olarak this geçmesi yapmak
    • tercihine bir OnPreferenceChangeListener ekleyin.
    • İade beyanı önemlidir. Bu, anahtardaki gerçek değişikliği yapan şeydir. Eğer true değerini döndürürseniz, anahtar yeni Değer'e dönüşecektir. Eğer yanlış döndürürsen, olmaz. return false;'u kullanırsanız, değeri, değer önceliğindeki setChecked (true | false) ile değiştirebilirsiniz.
      • onClick() Uygulanışı:
    • Eğer onPreferenceChange(Preference preference, Object newValue) uygulamak zaman tercihini tıklayarak gelen işlevselliği üç şekilde yapılabilir sadece

    • anahtarı-sürgüsünü basarak gelen ne istersen işlevsellik ekleyebilir daha özel SwitchPreference sınıf
    • fragmandaki yöntem onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) uygulamak
    • ChangeListener için yaptığınız gibi bir onPreferenceClickListener uygulayın. Bunun uzun sonrası ise

üzgünüm. Bu benim ilk ve ben bu kadar çok stackoverflow-sayfalar ile olmuştur ve hiç kimse doğru, sadece doğru almak istedim;)

+0

Tercih aktivitenizin kodunuz da çok yardımcı olurdu. Kontrol edilebilir widget (anahtar, onay kutusu, vb.) Ile her türlü tercihi uygulamak için genel olarak iyi bir çözüm. – lostintranslation

+0

@Yokich, teşekkürler. Bu benim Moto X (API 4.4.4) üzerinde harika çalışıyor, ancak maalesef Nexus 4'te (API 5.0) çalışmıyor. Android kaynak koduna göre ('SwitchPreference'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''], fakat N4, sadece, düğmesine basıldığında sadece onDeğişim'i kaydeder Herhangi bir fikir? – Anonsage

+0

Senin için hiç bir cevabım yok, üzgünüm. Aradığınızı bulacağınızı umuyoruz – Yokich