web-dev-qa-db-ja.com

プログラムでPreferenceCategoryを削除する方法?

プログラムでPreferenceCategoryを削除する必要があります。次のコードで個々の設定を削除できますが、PreferenceCategory全体も削除(無効化)する必要があります。

PreferenceScreen preferenceScreen = getPreferenceScreen();
EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22");
((PreferenceGroup) findPreference("prefcat")).removePreference(etp);

編集: PreferenceCategory "prefcat"と子プリファレンス "pref22"の作業コードは次のとおりです。

PreferenceScreen preferenceScreen = getPreferenceScreen();
EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22");

PreferenceGroup preferenceGroup = (PreferenceGroup) findPreference("prefcat");
if (preferenceGroup != null) {
    preferenceGroup.removePreference(etp);
    preferenceScreen.removePreference(preferenceGroup);
}
36
Harald Wilhelm

最初にPreferenceCategoryをロードしないでください。

Javaで設定を定義している場合は、PreferenceCategoryを作成しないでください。

設定をXMLで定義する場合は、3つのXMLファイルを使用します。

  1. この魔法のカテゴリーの前のもののためのもの
  2. 魔法のカテゴリー用
  3. この魔法のカテゴリーの後のもののためのもの

カテゴリが必要な状況では、3つのXMLファイルすべてをロードします。カテゴリが不要な場合は、最初と3番目のXMLファイルのみをロードします。

17
CommonsWare

PreferenceScreenへの参照を取得して、カテゴリを非表示にすることができます。

私はあなたのxml:

<PreferenceScreen 
xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:key="@string/preferenceScreen">

//set all you values
//Preference, PreferenceCategory and/or CheckBoxPreference

</PreferenceScreen>

あなたのstring.xml:この新しい文字列を設定することを忘れないでください

 <string name="preferenceScreen" translatable="false">preferenceScreen</string>

あなたのコードで:

preferenceScreen = (PreferenceScreen) findPreference(getResources().getString(R.string.preferenceScreen));

次に、PreferenceScreenからカテゴリを削除します。

myCategory = (PreferenceCategory) findPreference(getResources().getString(R.string.my_category));
myPreferenceScreen.removePreference(myCategory);
68
douarbou

XMLでPreferenceScreenとPreferenceCategoryのキーを提供します。

<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:key="preferenceScreen" >

  <PreferenceCategory
     Android:summary="@string/settings_billing_summary"
     Android:title="Title"
     Android:key="myPrefCat" >
      <Preference
      Android:key="someKey"
      Android:summary="Sum"
      Android:title="Title" />
   </PreferenceCategory>

</PreferenceScreen>

クラスから、preferenceScreenとpreferenceCategoryを参照し、removePreference()メソッドを使用して画面から設定を削除できます。

    PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");
    PreferenceCategory myPrefCat = (PreferenceCategory) findPreference("myPrefCat");
    preferenceScreen.removePreference(myPrefCat);

この回答は douarbouの回答 に基づいています。これは古くなっているように見えますが、基本的には同じです。

11
Mdlc

親のIDを使用せずに、すべての設定を走査して、希望する設定の親がどれであるかを確認することで、子親ツリー全体を見つけることができます。

public static Map<Preference,PreferenceGroup> buildPreferenceParentTree(final PreferenceActivity activity)
    {
    final Map<Preference,PreferenceGroup> result=new HashMap<Preference,PreferenceGroup>();
    final Stack<PreferenceGroup> curParents=new Stack<PreferenceGroup>();
    curParents.add(activity.getPreferenceScreen());
    while(!curParents.isEmpty())
      {
      final PreferenceGroup parent=curParents.pop();
      final int childCount=parent.getPreferenceCount();
      for(int i=0;i<childCount;++i)
        {
        final Preference child=parent.getPreference(i);
        result.put(child,parent);
        if(child instanceof PreferenceGroup)
          curParents.Push((PreferenceGroup)child);
        }
      }
    return result;
    }

使用例:

  final Map<Preference,PreferenceGroup> preferenceParentTree=buildPreferenceParentTree(SettingsActivity.this);
  final PreferenceGroup preferenceGroup=preferenceParentTree.get(preferenceToRemove);
  preferenceGroup.removePreference(preferenceToRemove);

編集:これのための新しいAPIがあるようです:

https://developer.Android.com/reference/androidx/preference/Preference#setVisible(boolean)

現在利用できるかどうかはわかりませんが。

2