web-dev-qa-db-fra.com

Une seule page PréférenceActivité sans en-têtes / fragments?

J'essaie d'accomplir quelque chose que je pense être assez facile, mais je suis perplexe sur la façon de l'accomplir à l'aide de la classe PreferenceActivity et de la balise d'en-tête de préférence xml.

Lorsque l'utilisateur appuie sur l'icône des paramètres de l'application, je souhaite qu'il présente une petite liste de cases à cocher et de listes. Je n'ai qu'un seul fragment de préférence. Jusqu'à présent, je peux configurer les fichiers xml PreferenceActivity (preferences.xml et xmls des fragments de préférence) pour afficher l'en-tête unique du fragment de préférence. Lorsque l'utilisateur sélectionne cet en-tête, l'écran des préférences correspond exactement à ce que je veux, cependant, je ne peux pas trouver un moyen d'ignorer le premier écran d'en-tête.

Il semble inutile de toucher l'icône des paramètres/préférences, d'afficher un seul en-tête qui est ensuite exploité pour accéder aux paramètres/préférences réels.

Je comprends comment cela peut être très utile si vous souhaitez classer vos préférences, mais pour quelque chose de simple, cela ajoute des frais généraux et semble plutôt maladroit.

J'espère que j'ai été clair. En bref, voici ma question:

Quelle est la nouvelle façon privilégiée d'utiliser la classe PreferenceActivity et la balise d'en-tête de préférence pour afficher simplement un seul écran d'options sans en-tête?

Après avoir regardé un peu plus, il semble que j'essaie de faire ce que les anciennes méthodes faisaient de manière simple. J'essaie de le faire avec sans utiliser aucune des fonctions obsolètes.

Merci d'avance, B.

61
Billbris

La nouvelle méthode préférée consiste à afficher un seul PreferenceFragment comme contenu principal de toute activité. Il n'est pas nécessaire que ce soit PreferenceActivity. Voir l'exemple de démonstration des API

public class FragmentPreferences extends Activity {

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

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction().replace(Android.R.id.content,
                new PrefsFragment()).commit();
    }


    public static class PrefsFragment extends PreferenceFragment {

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

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.preferences);
        }
    }

}  
89
AJAY PRAKASH

Je cherchais une réponse qui correspondait à cette question. Finalement, je l'ai élaboré à partir de plusieurs autres sources. Pour ceux qui voudront peut-être encore une réponse, voici ce qui a fonctionné pour moi. (Remarque - les SDK min et cible sont définis sur 15 dans ce projet.)

  1. Videz les PreferenceHeaders, vous n'en aurez pas besoin.
  2. Créez un écran de préférences avec les paramètres d'une seule page.
  3. Créez une classe d'activité de préférence (SettingsActivity ci-dessous).
  4. Créez une classe en ligne étendant PreferenceFragment (LocationFragment ci-dessous).
  5. Définissez la classe dans le manifeste.
  6. Démarrez la tâche - voir le code de menu ci-dessous.

Classe de préférence qui affiche l'écran de paramètres unique.

public class SettingsActivity extends PreferenceActivity {

    private final static String TAG = "SettingsAcitivity";

    public SettingsActivity() {}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyLog.d(TAG, "onCreate");
        getFragmentManager().beginTransaction()
                .replace(Android.R.id.content, new LocationFragment()).commit();
    }

    public class LocationFragment extends PreferenceFragment {

        private final static String TAG = "LocationFragment";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            MyLog.d(TAG, "onCreate");
            addPreferencesFromResource(R.xml.locationsettings);
        }
    }
}

Le code pour afficher les paramètres:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    MyLog.d(TAG, "onOptionsItemSelected");
    switch (item.getItemId()) {
    case R.id.menu_main_help:
        break;
    case R.id.menu_main_about:
        break;
    case R.id.menu_main_settings:
        MyLog.d(TAG, "Settings");
        Intent settingsIntent = new Intent(this, SettingsActivity.class);
        startActivity(settingsIntent);
        break;
    }
    return true;
}

La touche Retour met fin à la SettingsActivity. Les routines de préférences intégrées enregistrent toutes les modifications. La fonction onResume que j'ai fait un getSettings () qui met à jour tous les paramètres modifiés utilisés par l'activité d'appel (MainActivity dans ce cas).

C'est ça.

25
Howard Hodson