我有延伸PreferenceActivity的活动。我从XML文件中加载的偏好。但在某些情况下,我需要完全隐藏屏幕基于我的应用程序状态的喜好之一。有一个setEnabled方法,但它不正是我想要的。我想彻底去除屏幕偏好。可能吗 ?
是的,如果你有两个Preference
,与其父(一PreferenceCategory
,或PreferenceScreen
)参考
myPreferenceScreen.removePreference(myPreference);
由于Android API 26 getParent()
方法可用:https://developer.android.com/reference/android/preference/Preference.html#getParent()
虽然你可以做到以下几点:
preference.getParent().removePreference(preference);
您可以通过两种方式做到这一点:
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;
}
如果你要评估,并基于该面膜,另一种可能是
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);
如果您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,我已经找到了最好的办法就是把我所有的子选项分成两个类别的容器。最初,你必须显示的一切,那么你只是删除你不想要的位。聪明的一点,就是你刚刚触发时有新的变化,然后您不必手动创建任何东西,或担心在正确的顺序把东西放回重建。
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
我建议使用V7的偏好,它有setVisible()
方法。但我还没有尝试过呢。因此,你必须改用PreferenceFragment
的PreferenceActivity
。
如果你正在使用PreferenceFragmentCompat您可以设置在XML中的知名度。
在XML中的首选项将被自动转换为程序兼容性版本。然后,您可以使用“应用程序:isPreferenceVisible”属性,在XML
的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"
/>