android - studio - 從屏幕上刪除/隱藏首選項




user preference android (6)

在XML文件中,您可以通過將標題和摘要標籤留空來製作隱藏偏好設置。

<EditTextPreference
    android:defaultValue="toddlerCam"
    android:key="save_photo_dir"
/>

https://code.i-harness.com

我有一個擴展PreferenceActivity的活動。 我從XML文件加載首選項。 但在某些情況下,我需要根據我的應用程序狀態完全隱藏屏幕上的某個偏好設置。 有一個setEnabled方法,但它不完全是我想要的。 我想從屏幕上完全刪除該偏好。 可能嗎 ?


在你的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

如果你想要一些可以動態改變首選項的東西,比如在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();
    }
}

我能看到的唯一不足之處在於屏幕是從頭開始重新創建的。


如果你想評估,並且基於這個面具,一個替代方案可能是/(Si deseas評估,y en基於一個ocultar,una alternativa puede ser):

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);
            }

所有這些都必須在/(Todo esto debe ir dentro)內:

公共靜態類PrefsFragment擴展PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


無論首選項是在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;
}






preferences