PreferenceActivityを拡張するアクティビティがあります。 XMLファイルから設定を読み込んでいます。しかし、場合によっては、アプリの状態に基づいて設定を画面から完全に隠す必要があります。 setEnabledメソッドがありますが、それはまさに私が望むものではありません。その設定を画面から完全に削除したいです。出来ますか ?
はい、Preference
とその親(PreferenceCategory
またはPreferenceScreen
)の両方への参照がある場合
myPreferenceScreen.removePreference(myPreference);
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);
設定が設定画面の直接の子である場合、いくつかのスタンドアロンコードがあります。
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
たとえば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();
}
}
私がこれで見ることができる唯一の欠点は、画面がゼロから再作成されるときにフラッシュがあることです。
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
setVisible()
メソッドを持つv7設定を使用することをお勧めします。しかし、私はまだ試していません。したがって、PreferenceFragment
の代わりにPreferenceActivity
を使用する必要があります。
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 で文書化されています
PreferenceFragmentCompat
の追加は https://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();
}
}
これが、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;
}
XMLファイルでは、タイトルとサマリータグを空のままにして、非表示の設定を行うことができます。
<EditTextPreference
Android:defaultValue="toddlerCam"
Android:key="save_photo_dir"
/>
Android API 26 getParent()
メソッドが利用可能です: https://developer.Android.com/reference/Android/preference/Preference.html#getParent( )
ただし、次のことができます。
preference.getParent().removePreference(preference);
あなたが評価したい場合、そしてそのマスクに基づいて、代替案があります
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);
これは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;
}