Программно заполняющий подэкран PreferenceScreen, уже содержащийся в PreferenceFragment XML - PullRequest
0 голосов
/ 30 августа 2018

Извините за странный заголовок.

Я хочу программно добавить PreferenceCategory к одному из моих PreferenceScreens, которые уже существуют в этом файле (обрезанная версия моего preferences.xml):

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Monitored Zones -->
    <PreferenceScreen
        android:key="pref_ps_mz"
        android:title="Zones surveillées"
        android:summary="Pour gérer vos zones surveillées"
        android:icon="@drawable/ic_pref_mz">

        <SwitchPreference
            android:key="pref_mz_sw_mzDisplayFilter"
            android:title="Afficher"
            android:summary="Les zones surveillées seront affichées en rouge sur votre carte"
            android:defaultValue="true" />

        <PreferenceScreen
            android:key="pref_mz_removeAll"
            android:title="Toutes les supprimer"
            android:summary="Pour supprimer toutes vos Zones Surveillées" />
    </PreferenceScreen>

    <!-- Notifications -->
    <PreferenceScreen
        android:key="pref_ps_notif"
        android:title="Notifications"
        android:summary="Les notifications vous sont envoyées par notre serveur selon vos préférences"
        android:icon="@drawable/ic_pref_notifs">

        <SwitchPreference
            android:key="pref_notif_sw_mirrorAlertFilters"
            android:title="Appliquer mes filtres d'alertes"
            android:summary="Pour ne recevoir des notifications qu'en lien avec les alertes que vous affichez sur la carte (ces préférences se retrouvent dans la catégorie « Filtres d'alertes »)"
            android:defaultValue="false"/>
    </PreferenceScreen>

</PreferenceScreen>

В частности, PreferenceScreen с android:key="pref_ps_mz" - это то, к которому я хотел бы добавить PreferenceCategory. Это PreferenceCategory должно появиться после android:key="pref_mz_removeAll", и я должен иметь возможность программно заполнять его PreferenceScreen Объектами, основываясь на количестве объектов, доступных для отдельного удаления. Я предполагаю, что как только это будет сделано, я легко смогу добавить «onClickListeners» к каждому из этих PreferenceScreen объектов.

Вот мой (обрезанный) SettingsPrefFragment.java файл:

public class SettingsPrefFragment extends PreferenceFragment {

    private SharedPreferences sharedPref;


    public SettingsPrefFragment() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());

        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

        /*
        Keys hierarchy:
            pref_ps_mz
                pref_mz_sw_mzDisplayFilter
                pref_mz_removeAll
            pref_ps_notif
                pref_notif_sw_mirrorAlertFilters
                pref_notif_sw_noise
                pref_notif_sw_block
         */

        /*
            Monitored Zones
         */

        Preference mzPref = findPreference("pref_ps_mz");
        mzPref.setEnabled(false);

        // Enabling access only if authenticated
        if(user != null) {
            mzPref.setEnabled(true);
        }

        // Managing monitored zones
        findPreference("pref_mz_sw_mzDisplayFilter").setOnPreferenceClickListener(preference -> {
            PinController.PinPreferences.showMonitoredZones = sharedPref.getBoolean("pref_mz_sw_mzDisplayFilter", true);
            return true;
        });

        // TODO: DISABLE if the user has 0 MZ
        // Removing all MonitoredZones
        findPreference("pref_mz_removeAll").setOnPreferenceClickListener(preference -> {

            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
            alertDialogBuilder.setMessage("Voulez-vous vraiment effacer toutes vos Zones Surveillées?");

            alertDialogBuilder.setNegativeButton("Annuler", (dialog, which) -> dialog.cancel()); // rien faire
            alertDialogBuilder.setPositiveButton("Oui", (arg0, arg1) -> {
                MainActivity.myMapDisplay.getZoneController().clearAllZones(user);
            });

            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();

            return true;
        });

        // TODO: Programmatically populate a PreferenceCategory with MonitoredZonesWrapper's MonitoredZones



        /*
            Notifications
         */

        Preference notifPref = findPreference("pref_ps_notif");
        notifPref.setEnabled(false);

        // Enabling access only if authenticated
        if(user != null) {
            notifPref.setEnabled(true);
        }
    }
}

Я пробовал это решение (добавлено к onCreate() фрагмента), но его недостаточно, и я не мог понять, как его использовать, чтобы делать, как я хочу:

    PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());

    PreferenceCategory category = new PreferenceCategory(getActivity());
    category.setTitle("category name");

    screen.addPreference(category);

    CheckBoxPreference checkBoxPref = new CheckBoxPreference(getActivity());
    checkBoxPref.setTitle("title");
    checkBoxPref.setSummary("summary");
    checkBoxPref.setChecked(true);

    category.addPreference(checkBoxPref);
    setPreferenceScreen(screen);

    addPreferencesFromResource(R.xml.preferences);

Можно добавить только PreferenceCategory в самом верху корня PreferenceScreen. Мне нужно иметь возможность заполнять нижнюю часть вспомогательного экрана.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 31 января 2019

Добавьте PreferencesFromResource перед добавлением категории, чтобы программно добавленные элементы помещались после настроек, загруженных из xml.

addPreferencesFromResource(R.xml.preferences); //Placement matters!

PreferenceScreen screen = (PreferenceScreen)findPreference("pref_ps_mz");
PreferenceCategory category = new PreferenceCategory(getActivity());
category.setTitle("category name");

screen.addPreference(category);

CheckBoxPreference checkBoxPref = new CheckBoxPreference(getActivity());
checkBoxPref.setTitle("title");
checkBoxPref.setSummary("summary");
checkBoxPref.setChecked(true);

category.addPreference(checkBoxPref);
//setPreferenceScreen(screen); //Unnecessary as long as the above code is in the onCreate section
...