Androidの好みを動的に表示して非表示する方法は?
-
11-10-2019 - |
質問
好みを動的に表示して非表示にする方法はありますか?私の場合、2つの設定グループのいずれかを無効または有効にするチェックボックスの設定があります(「with」および "without handicapグループ)。これはデスクトップ環境の理想的なGUIですが、「ハンディキャップで」は画面全体を占め、もう1つは「ハンディキャップなし」が画面のごく一部しか占めていません。
両方のグループを同時に表示するのではなく、一度にそれらの1つだけを表示し、チェックボックスが変更されたときに2つのグループを動的に表示または非表示にしたいと思います。これを行う方法はありますか?
解決
好みの反応性呼び出しから
Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removePreference(somePreference);
後で電話することができます:
preferenceScreen.addPreference(somePreference);
少し難しい部分は、再び追加するときに注文を正しくすることです。 設定スクリーン ドキュメント、特に基本クラス、 PreferenceGroup 詳細については。
ノート: 上記は、 PreferenceScreen
. 。ある場合 PreferenceCategory
その間に、あなたはその親からの好みを削除する必要があります PreferenceCategory
, 、ではありません PreferenceScreen
. 。最初にを確保する PreferenceCategory
持っています android:key
XMLファイルに属性設定。それで:
Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(SOME_PREFERENCE_CATEGORY_KEY);
preferenceCategory.removePreference(somePreference);
と:
preferenceCategory.addPreference(somePreference);
他のヒント
正確に隠れたり表示したりするわけではありませんが、別の好みに応じて、無効化/有効化の好みのみが必要な場合は、指定できます android:dependency="preferenceKey"
また Preference.setDependency(String)
<?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>
使用することをお勧めします V7優先, 、持っています setVisible()
方法。しかし、私はまだ試していません。
好みの設定の隠れを完全に好みに実装したい場合は、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
}
似たようなものが必要でした。スイッチを切り替えて、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_01 と pref_extra_stuff_02 いつ隠されている2つの好みです pref_show_extra_stuff 切り替えられます。
設定を動的に隠すために、PREMに表示したいかどうかを決定する価値についてIFコンディションを作成しました。実際の隠れを行うために、私は次のように使用しています。
findPreference(getString(R.string.pref_key)).setLayoutResource(R.layout.hidden);
トリッキーな部分は、再び見えるようにすることです。レイアウトを再現する以外に、直接的な方法はありません。 IFコンディションの値がfalseである場合、つまりprefが表示されることを意味する場合、prefを非表示にするコードが実行されないため、可視prefが表示されます。レイアウトを再現する方法は次のとおりです(私の場合、私は設定リストの拡張を拡張しています):
getActivity().recreate();
それが役に立ったことを願っています。