36

設定を動的に表示および非表示にする方法はありますか?私の場合、2つの設定グループ(「with-」および「without-handicap」グループ)のいずれかを無効または有効にするチェックボックス設定があります。これはデスクトップ環境では理想的なGUIですが、「ハンディキャップあり」は画面のほぼ全体を占め、もう一方の「ハンディキャップなし」は画面のごく一部しか占めません。

両方のグループを同時に表示するのではなく、一度に1つだけを表示し、チェックボックスが変更されたときに2つのグループを動的に表示または非表示にします。これを行う方法はありますか?

4

6 に答える 6

68

PreferenceActivity呼び出しから

Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removePreference(somePreference);

後で呼び出すことができます:

preferenceScreen.addPreference(somePreference);

少し注意が必要なのは、追加し直すときに順序を正しくすることです。詳細については、 PreferenceScreenのドキュメント、特に基本クラスであるPreferenceGroupを参照してください。

注:上記は、の直接の子に対してのみ機能しPreferenceScreenます。間にある場合は、ではなく、PreferenceCategory親から設定を削除する必要があります。まず、XMLファイルに属性が設定されていることを確認します。それで:PreferenceCategoryPreferenceScreenPreferenceCategoryandroid:key

Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(SOME_PREFERENCE_CATEGORY_KEY);
preferenceCategory.removePreference(somePreference);

と:

preferenceCategory.addPreference(somePreference);
于 2011-01-16T07:51:26.340 に答える
7

正確に非表示/表示するわけではありませんが、別の設定に応じて設定を無効/有効にするだけの場合は、android:dependency="preferenceKey"またはPreference.setDependency(String)

developer.android.comの例:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="pref_sync"
        android:title="@string/pref_sync"
        android:summary="@string/pref_sync_summ"
        android:defaultValue="true" />
    <ListPreference
        android:dependency="pref_sync"
        android:key="pref_syncConnectionType"
        android:title="@string/pref_syncConnectionType"
        android:dialogTitle="@string/pref_syncConnectionType"
        android:entries="@array/pref_syncConnectionTypes_entries"
        android:entryValues="@array/pref_syncConnectionTypes_values"
        android:defaultValue="@string/pref_syncConnectionTypes_default" />
</PreferenceScreen>
于 2015-10-08T10:46:03.447 に答える
5

私はV7プリファレンスを使用することをお勧めします、それはsetVisible()方法を持っています。しかし、私はまだそれを試していません。

于 2017-06-09T01:46:39.357 に答える
1

プリファレンスでプリファレンスの非表示を完全に実装したい場合は、ここに1つの例があります。ただし、再度表示することはできません。

public class RemovablePreference extends Preference {

@Override
protected void onBindView(View view) {
    super.onBindView(view);

    updateVisibility(); // possibly a better place available?
}

private void updateVisibility() {
    Context context = getContext(); // should be a PreferenceActivity
    if (context instanceof PreferenceActivity) {
        updateVisibility((PreferenceActivity)context);
    }
}

private void updateVisibility(PreferenceActivity activity) {
    updateVisibility(getPreferenceScreen(activity));
}

private PreferenceScreen getPreferenceScreen(PreferenceActivity activity) {

    if (activity.getPreferenceScreen() != null) {
        return activity.getPreferenceScreen(); // for old implementations
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        Fragment fragment = activity.getFragmentManager().findFragmentById(android.R.id.content);
        if (fragment instanceof PreferenceFragment) {
            return ((PreferenceFragment) fragment).getPreferenceScreen();
        }
    }
    return null;
}

private void updateVisibility(PreferenceScreen screen) {
    if (!isVisible() && screen != null) {
        hidePreference(screen, this);
    }
}

private boolean hidePreference(PreferenceGroup prefGroup, Preference removedPreference) {
    boolean removed = false;

    if (prefGroup.removePreference(removedPreference)) {
        removed = true;
    }

    for (int i = 0; i < prefGroup.getPreferenceCount(); i++) {
        Preference preference = prefGroup.getPreference(i);
        if (preference instanceof PreferenceGroup) {
            PreferenceGroup prefGroup2 = (PreferenceGroup)preference;
            if (hidePreference(prefGroup2, this)) {
                // The whole group is now empty -> remove also the group
                if (prefGroup2.getPreferenceCount() == 0) {
                    removed = true;
                    prefGroup.removePreference(prefGroup2);
                }
            }
        }
    }

    return removed;
}

protected boolean isVisible() {
    return true; // override
}
于 2017-04-28T10:15:22.347 に答える
0

私は似たようなものが必要でした。スイッチを切り替えて、2つの追加の設定を表示または非表示にします。Android-Support-Preference-V7-Fixのサンプルアプリをチェックしてください。これにより、いくつかの新しい設定タイプが導入され、公式ライブラリのいくつかの問題が修正されます。チェックボックスを切り替えて設定カテゴリを表示または非表示にする例があります。

PreferenceFragmentCompatDividersを拡張するフラグメントでは、次のようなものを使用できます。

findPreference("pref_show_extra_stuff").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            findPreference("pref_extra_stuff_01").setVisible((Boolean) newValue);
            findPreference("pref_extra_stuff_02").setVisible((Boolean) newValue);
            return true;
        }
    });

pref_extra_stuff_01pref_extra_stuff_02は、pref_show_extra_stuffが切り替えられたときに非表示になる2つの設定です

于 2018-01-05T10:40:11.317 に答える
0

設定を動的に非表示にするために、設定を表示するかどうかを決定する値に基づいてif条件を作成しました。実際の隠蔽を行うために、私は以下を使用しています。

    findPreference(getString(R.string.pref_key)).setLayoutResource(R.layout.hidden);

トリッキーな部分は、それを再び表示することです。レイアウトを再作成する以外に、それを直接行う方法はありません。if-conditionの値がfalseの場合、つまり設定が表示されている必要がある場合、設定を非表示にするコードは実行されないため、設定が表示されます。レイアウトを再作成する方法は次のとおりです(私の場合、PreferencesListFragmentを拡張しています)。

    getActivity().recreate();

お役に立てば幸いです。

于 2018-05-10T22:43:58.610 に答える