画面から設定を削除/非表示にします


134

PreferenceActivityを拡張するアクティビティがあります。XMLファイルから設定をロードしています。しかし、場合によっては、アプリの状態に基づいて、設定の1つを画面から完全に非表示にする必要があります。setEnabledメソッドがありますが、それは私が望んでいるものではありません。画面からその設定を完全に削除したいと思います。出来ますか ?

回答:


171

はい、Preferenceとその親(a PreferenceCategoryまたはPreferenceScreen)の両方への参照がある場合

myPreferenceScreen.removePreference(myPreference);

すごい!ありがとう!機能し、完全に理にかなっている
Bostone

私はこれを通して自分の質問に答えたかもしれませんか?stackoverflow.com/a/4704360/956975
marienke

2
残念ながら、それは設定を永久に削除します。隠すだけでいいの?
ドミトリー

それも私にはうまくいきません。好みは残ります!
ドミトリー

@Dmitryあなたはそれを灰色にすることができますsetEnabled()
JakeD

212

あなたPreferenceが内にいるPreferenceCategory場合は、これを行う必要があります:

XML:

<PreferenceCategory
    android:key="category_foo"
    android:title="foo">

    <CheckBoxPreference
        android:key="checkPref" />

Java:

CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);

5
公平に言えば、上の答えは親が必要だと言っていますPreferenceCategory
マット

49

Preferenceが設定画面の直接の子である場合、いくつかのスタンドアロンコードを次に示します。

PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);

4
これは、設定がカテゴリ内にある場合は機能しません。あなたはfindPreferenceカテゴリーのために、そしてカテゴリーから好みを取り除く必要があります
MBH

1
@MBH:その警告に言及してくれてありがとう!
1

9

たとえばSwitchPreferenceの設定を動的に変更するものが必要な場合は、すべてのサブオプションを2つのカテゴリコンテナーに配置するのが最善の方法です。最初はすべてが表示されているので、不要なビットを削除するだけです。巧妙な点は、何かが変更されたときに再作成をトリガーするだけで、手動で何かを作成したり、正しい順序に戻すことを心配したりする必要がないことです。

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.preferences);
  PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne");
  PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo");
  SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref");
  PreferenceScreen screen = getPreferenceScreen();
  if (mySwitchPref.isChecked()) {
    screen.removePreference(prefCatOne);
  } else {
    screen.removePreference(prefCatTwo);
  }
}

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    if (key.equals("mySwitchPref")) {
        this.recreate();
    }
}

これでわかる唯一の欠点は、画面が最初から再作成されるときにフラッシュが発生することです。


ケースは、少なくとも22では機能しません。しかし、それを(設定のグループ化であっても)設定に変更しても機能します。
Rob

ロブ、私はAPI22 AVDで上記のコードをテストしたところ、問題なく動作しています。設定XMLコンテンツがコードと一致していることを確認してください。上記の例の場合、SwitchPreferenceはどこにでも配置できますが、PreferenceCategorysをPreferenceScreenの直接の子にする必要があります。
ジェームズ

カテゴリーを設定として、キャストなしで取得し、削除しました。働いた。
Rob

8

XMLファイルで:

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

    <PreferenceCategory
        android:key="personalisation"
        android:title="your title here">

        <ThemedPreference
            android:key="animation" />

</PreferenceScreen>

あなたのコードで:

PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");

PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation");
ThemedPreference pThemePref = (ThemedPreference) findPreference("animation");

pPreferenceScreen.removePreference(pCategory); //remove category
pCategory.removePreference(pThemePref);   // remove preference

8

PreferenceFragmentCompatを使用している場合は、xmlで可視性を設定できます。

xmlの設定はAppCompatバージョンに自動的に変換されます。次に、xmlで' app:isPreferenceVisible '属性を使用できます

preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <CheckBoxPreference
        android:defaultValue="false"
        android:key="show.navigation"
        android:title="Show navigation"
        app:isPreferenceVisible="false" />

...

属性はhttps://developer.android.com/guide/topics/ui/settings/components-and-attributesに記載されています

追加PreferenceFragmentCompathttps://developer.android.com/guide/topics/ui/settings/#inflate_the_hierarchyに文書化されています

例:

public class MySettingsActivity extends AppCompatActivity {

    public static class MySettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
} 


3

XMLファイルでは、タイトルと要約タグを空のままにして、非表示の設定を行うことができます。

<EditTextPreference
    android:defaultValue="toddlerCam"
    android:key="save_photo_dir"
/>

これは私にとって完璧な答えです。私はこれを探していました。ありがとうございました!
夏期劇場

2

ここでは関係なく、好みは下にあるかどうかの動作するこれを行うための汎用的な方法だPreferenceCategoryかをPreferenceScreen

private void removePreference(Preference preference) {
    PreferenceGroup parent = getParent(getPreferenceScreen(), preference);
    if (parent == null)
        throw new RuntimeException("Couldn't find preference");

    parent.removePreference(preference);
}

private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) {
    for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) {
        Preference child = groupToSearchIn.getPreference(i);

        if (child == preference)
            return groupToSearchIn;

        if (child instanceof PreferenceGroup) {
            PreferenceGroup childGroup = (PreferenceGroup)child;
            PreferenceGroup result = getParent(childGroup, preference);
            if (result != null)
                return result;
        }
    }

    return null;
}


0

これは2つの方法で実行できます。

1.サポートライブラリを使用する場合、設定ツリーとその親のマップを作成し、その親を使用して設定を削除できます。このようなマップを生成する関数は次のとおりです。

public static Map<Preference, PreferenceGroup> buildPreferenceParentTree(@NonNull final PreferenceScreen preferenceScreen) {
    final Map<Preference, PreferenceGroup> result = new HashMap<>();
    final Stack<PreferenceGroup> curParents = new Stack<>();
    curParents.add(preferenceScreen);
    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;
}
  1. 新しいandroid-x設定APIを使用する場合は、setVisible関数を使用して、可視性を設定できます。

よると、ドキュメントお茶の答えは、 setVisible()サポートライブラリのバージョン24.1.0以降で利用可能です。
JJD

私が書いたものを見ましたか?私は、特にそれが今可能です...また、第一溶液が...隠れよりビット違って、除去に役立つことを書いた
Androidデベロッパー

はい、あなたの答えを読みました。私はあなたの2番目のポイントを言及していました。明確にしようとしたandroid-xsetVisibile()からメソッドが利用できるかのように読みます。違反しないでください。
JJD

Android-Xは、すべてのサポートライブラリを置き換えるものです。私たちが知っているように、サポートライブラリの新しいバージョンはありません。
Android開発者、

正しい。私はこれを知っています。それでも、以前のバージョンに行き詰まっている人は、この方法を利用できます。
JJD

0

評価したい場合、そのマスクに基づいて、代替案は

SwitchPreference autenticacionUsuario = 
    (SwitchPreference) findPreference("key_autenticacion_usuario");

final EditTextPreference Username = 
    (EditTextPreference) findPreference("key_username_mqtt");
final EditTextPreference Password = 
    (EditTextPreference) findPreference("key_password_mqtt");

if (!autenticacionUsuario.isChecked()) {
    PreferenceCategory preferenceCategory = 
        (PreferenceCategory) findPreference("category_mqtt");
    preferenceCategory.removePreference(Username);
    preferenceCategory.removePreference(Password);
}

これはすべて内にある必要があります

public static class PrefsFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

1
申し訳ありませんが、これは英語のサイトです。英語で答えてもらえますか?
Dave Schweisguth、2016年

もちろん、私の意図は、英語を話さない人々のためにも提供することでした
グスタボエドゥアルドベルドゥマ2016年

3
@GustavoEduardoBeldumaの場合、このmeta.stackoverflow.com/a/297680/545026
Leoはモニカ

0

あなたがやろうとしていると私が思っていることをしているなら(私は今やろうとしているので)設定を有効/無効にする方が良いかもしれません。削除すると設定画面から削除され、画面をプログラムで作成した場合は、必要な場所に戻すことができない場合があるためです。

pref.setEnabled(false); pref.setEnabled(true);

ただし、これは廃止される可能性があります。私が今経験しているユースケースで機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.