2017-04-04 60 views
0

我填充我的喜好的部分編程。這工作正常。不幸的是,當用戶改變一些偏好(想象一下「添加新的鬧鐘」偏好)時,必須添加新的偏好。這工作得很好,以及,當我使用PreferenceCategorie S(因爲新的在一個這樣的末尾添加,所以myPreferenceCategory.addPreference(newPreference)的伎倆)。但是,我能做些什麼以編程方式添加一個優先於任何特定的地方(不只是平常類的盡頭/ prefScreen ??添加偏好特定的地方PreferenceScreen編程


not so invisible category

我試圖用某種「隱形」 PreferenceCategory的通過與

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/my_custom_invis_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingBottom="0dp" 
    android:paddingTop="0dp" 
    android:layout_marginTop="0dp" 
    android:layout_marginBottom="0dp"/> 

不幸的是設置android:layout="my_custom_invis_layout"這些空白和邊距似乎並沒有對最小空間的空類別採取影響(但正值這樣做,這是 - 原因 - 沒有幫助) 。


我試着以及由

<PreferenceCategory 
    android:layout="@null"> 

以抵消佈局但這恰恰擴大了類別採取那些其他的喜好有空間。


不幸的是,迄今爲止,這並沒有幫助我。我將非常高興,如果有人可以點我喜歡的東西「增加的偏好的偏好低於B」或如何使服用類沒有空間可言(因爲這將解決我的問題,以及)。

+0

經過了一個多星期,我似乎沒有問過一個愚蠢簡單的問題,至少。不幸的是,我仍然沒有找到解決方案。 –

回答

2

好吧,我已經嘗試過使用Preferences#setOrder(int)的其他方法。 (我在那裏留下了以前的答案,因爲某些用例可能是更簡單的解決方案。)這個更適合您的需求嗎?

public class PreferencesFragment extends PreferenceFragmentCompat { 
    private SharedPreferences mSharedPreferences; 
    PreferenceCategory mMyPreferenceCategory; 
    // ArrayList to keep track of the currently added Preferences 
    ArrayList<Preference> mPreferenceList = new ArrayList<>(); 
    // this counter only serves for name-giving of the added 
    // Preferences in this example 
    int mCounter = 0; 

    @Override 
    public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) { 
     addPreferencesFromResource(R.xml.preferences); 
     mMyPreferenceCategory = (PreferenceCategory) findPreference("preferenceCategoryKey"); 
     addPreference(null); 
    } 

    // adds a Preference that is inserted on the position of the 
    // clicked Preference, moving the clicked Preference - and all 
    // Preferences after - one position down 
    private void addPreference(Preference pref) { 
     int order = 0; 
     if (pref != null) { 
      order = pref.getOrder(); 
     } 
     for (Preference preference : mPreferenceList) { 
      int oldOrder = preference.getOrder(); 
      if (oldOrder >= order) { 
       preference.setOrder(oldOrder+1); 
      } 
     } 
     Preference newPreference = new Preference(getContext()); 
     newPreference.setTitle("Preference " + mCounter); 
     newPreference.setOrder(order); 
     newPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
      @Override 
      public boolean onPreferenceClick(Preference preference) { 
       addPreference(preference); 
       return false; 
      } 
     }); 
     mMyPreferenceCategory.addPreference(newPreference); 
     mPreferenceList.add(newPreference); 
     mCounter++; 
    } 
} 
+0

抱歉這麼久。最後我花了一些時間來測試這個,我必須說:Hurray,它的作用就像一個魅力!非常感謝您向我指出這一點! –

+1

很酷,很高興我能幫忙! :) – kazume

1

我看這個問題是很老,但因爲我正面臨着類似的問題,並設法解決它,我想不會有什麼用呢發佈完成壞處。 我解決這個問題的方法是,通過添加偏好(在我的情況是需要在一個特定的點被添加其中包括其他類別的類別)的XML從一開始,編程刪除它,如果沒有必要的。之後將其放回(以編程方式)時,它會在刪除它之前出現在相同的位置。還沒有嘗試過你的特殊情況(單個首選項需要進入某個類別中的特定位置),但我敢打賭,它的工作原理是一樣的。

public class PreferencesFragment extends PreferenceFragmentCompat { 
    private SharedPreferences mSharedPreferences; 
    private PreferenceCategory mPreferenceCategory; 

    @Override 
    public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) { 
     addPreferencesFromResource(R.xml.preferences); 
     mPreferenceCategory = (PreferenceCategory) findPreference("preferenceCategoryKey"); 

     if (preferenceNotRequiredYet) { 
      removePreferenceCategory(); 
     } 

     // an I have a SharedPreferenceListener attached that calls 
     // addPreferenceCategory when I need to add it back 
    } 

    private void removePreferenceCategory() { 
     PreferenceScreen parentScreen = (PreferenceScreen) findPreference("parent_screen_key"); 
     parentScreen.removePreference(mPreferenceCategory); 
    } 

    private void addPreferenceCategory() { 
     PreferenceScreen parentScreen = (PreferenceScreen) findPreference("parent_screen_key"); 
     parentScreen.addPreference(mPreferenceCategory); 
    } 
} 
+0

感謝您的回答 - 我相信,如您預期的那樣,此功能對單一偏好效果非常好。但我不知道用戶想要在那裏有多少偏好。因此,恐怕我不能使用你的解決方案(除了猜測一個大的(隨機)數x並希望沒有人會嘗試超過這個數)。必須有一個解決方案莫名其妙... –

+0

你試過[首#setOrder(INT)(https://developer.android.com/reference/android/preference/Preference.html#setOrder(INT))? – kazume