2017-04-04 17 views
0

私はプリファレンスの一部をプログラム的に入力しています。これは正常に動作します。残念ながら、ユーザーがいくつかの設定を変更したときに新しい設定が追加されなければなりません(「新しいアラームを追加」の設定を考えてください)。これは、私がPreferenceCategorieを使用したときにうまくいきます(新しいものが末尾に追加されたので、myPreferenceCategory.addPreference(newPreference)はそのトリックを行います)。しかし、私はプログラム的に、私は「目に見えない」PreferenceCategoryのいくつかの種類を使用しようとした任意の特定の場所(通常のカテゴリだけでなく、エンド/ prefScreen ??PreferenceScreen内の特定の場所にプログラムでプログラムを追加する


not so invisible category

に好みを追加するために何ができます、

<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

1週間以上経過しても、私は愚かに簡単な質問をしていないようです。残念ながら、私はまだこの解決策を見つけていません。 –

答えて

2

[OK]を選んで、他の方法で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

しばらく時間をとって申し訳ありません。最後に私はこれをテストする時間があり、私は言う必要があります:ハレイ、それは魅力のように動作します!これを私に指摘してくれてありがとう! –

+1

私は助けてくれると嬉しいです! :) – kazume

1

この質問はかなり古いですが、私は同様の問題に直面していたので、それを解決することができたので、とにかく投稿することで害はないと思いました。 私がこれを解決したのは、最初からxmlのPreference(私の場合は、他のカテゴリの特定の場所に追加する必要のあるカテゴリ)を追加し、必要がなければプログラムで削除します。後で(プログラム的に)それを戻すとき、それはそれを取り除く前の同じ位置に現れる。あなたの特定のケースを試してみませんか(カテゴリー内の特定の場所に移動する必要がある単一の設定で)、同じ方法で動作するでしょう。

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

そのお返事ありがとうございます - これは、あなたが期待したように、1つの環境設定ではうまくいくと思います。しかし、ユーザーが設定したい設定の数がわかりません。したがって、私はあなたのソリューションを私のケースで使うことはできないのではないかと心配しています(大きな(ランダムな)番号xを推測し、誰もそれを超えようとしないことを望みます)。何らかの理由で解決策が必要です... –

+0

[Preference#setOrder(int)](https://developer.android.com/reference/android/preference/Preference.html#setOrder(int))を試しましたか? – kazume

関連する問題