我有一个扩展了PreferenceActivity的活动。我正在从XML文件加载首选项。但在某些情况下,根据我的应用程序状态,我需要完全隐藏屏幕上的一个偏好设置。虽然有setEnabled方法,但这并不完全是我想要的。我想彻底从屏幕上删除该偏好设置。这可行吗?
我有一个扩展了PreferenceActivity的活动。我正在从XML文件加载首选项。但在某些情况下,根据我的应用程序状态,我需要完全隐藏屏幕上的一个偏好设置。虽然有setEnabled方法,但这并不完全是我想要的。我想彻底从屏幕上删除该偏好设置。这可行吗?
PreferenceCategory
中,则需要执行以下操作:<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);
如果你有对于Preference
和其父级(一个PreferenceCategory
或PreferenceScreen
)的引用,那么是可以的。
myPreferenceScreen.removePreference(myPreference);
setEnabled()
来将其置为灰色。 - JakeD如果Preference是PreferenceScreen的直接子项,这里是一些独立的代码:
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
findPreference
方法搜索该类别,并从中删除偏好设置。 - MBHpreferences.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();
}
}
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();
}
}
<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
。
<EditTextPreference
android:defaultValue="toddlerCam"
android:key="save_photo_dir"
/>
getParent()
可用:https://developer.android.com/reference/android/preference/Preference.html#getParent()
虽然您也可以执行以下操作:preference.getParent().removePreference(preference);
//In your Activity code after finding the preference to hide:
if(pref!=null) {
pref.setEnabled(false);
pref.setSelectable(false);
//Following line will replace the layout of your preference by an empty one
pref.setLayoutResource(R.layout.preference_hidden);
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp"/>
无论您喜欢将偏好设置隐藏在偏好设置组中还是根目录中,它都可以正常工作!
android:visibility="gone"
。 - Mic
PreferenceCategory
。 - matt