Comment implémenter une confirmation (oui / non) DialogPreference?

Réponses:

292

C'est une simple boîte de dialogue d'alerte , Federico vous a donné un site où vous pouvez rechercher des choses.

Voici un court exemple de la manière dont une boîte de dialogue d'alerte peut être créée.

new AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Do you really want to whatever?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int whichButton) {
        Toast.makeText(MainActivity.this, "Yaay", Toast.LENGTH_SHORT).show();
    }})
 .setNegativeButton(android.R.string.no, null).show();
Maaalte
la source
3
Je sais comment construire une boîte de dialogue, mais mon q sur les préférences.
sh1ng
1
Votre question concerne les préférences? D'accord. Jetez un oeil ici: kaloer.com/android-preferences
Maaalte
1
J'ai déjà lu cette source. Je peux créer une préférence personnalisée souscrite à OnClick et la gérer, mais est-ce le moyen le plus simple?
sh1ng
Je pense que oui, du moins je ne connais pas d'autre moyen qui soit plus facile.
Maaalte
1
utilisez import android.support.v7.app.AlertDialog; pour un meilleur look sans thème
majurageerthan
9

Android est livré avec une classe YesNoPreference intégrée qui fait exactement ce que vous voulez (une boîte de dialogue de confirmation avec des options oui et non). Voir le code source officiel ici .

Malheureusement, il est dans le com.android.internal.preferencepackage, ce qui signifie qu'il fait partie des API privées d'Android et que vous ne pouvez pas y accéder depuis votre application (les classes d'API privées sont sujettes à modification sans préavis, d'où la raison pour laquelle Google ne vous permet pas d'y accéder).

Solution: recréez simplement la classe dans le package de votre application en copiant / collant le code source officiel à partir du lien que j'ai fourni. J'ai essayé ceci, et cela fonctionne bien (il n'y a aucune raison pour que cela ne le soit pas)

Vous pouvez ensuite l'ajouter à votre preferences.xmlpréférence comme n'importe quelle autre. Exemple:

<com.example.myapp.YesNoPreference
    android:dialogMessage="Are you sure you want to revert all settings to their default values?"
    android:key="com.example.myapp.pref_reset_settings_key"
    android:summary="Revert all settings to their default values."
    android:title="Reset Settings" />

Ce qui ressemble à ceci:

capture d'écran

XåpplI'-I0llwlg'I -
la source
1
Excellente solution! Mais il y a un problème avec l'un des constructeurs de cette classe! Il fait référence à une ressource attr (com.android.internal.R.attr.yesNoPreferenceStyle)! Ce qui ne peut être résolu. Quelle est la solution de contournement? Dois-je en créer un dans mon propre projet?!
reubenjohn
3

Utilisez la préférence d'intention si vous utilisez l'écran de préférence xml ou vous si vous utilisez votre écran personnalisé, le code serait comme ci-dessous

intentClearCookies = getPreferenceManager().createPreferenceScreen(this);
    Intent clearcookies = new Intent(PopupPostPref.this, ClearCookies.class);

    intentClearCookies.setIntent(clearcookies);
    intentClearCookies.setTitle(R.string.ClearCookies);
    intentClearCookies.setEnabled(true);
    launchPrefCat.addPreference(intentClearCookies);

Et puis créez une classe d'activité un peu comme ci-dessous, en tant que personnes différentes comme approche différente, vous pouvez utiliser n'importe quelle approche que vous aimez, ce n'est qu'un exemple.

public class ClearCookies extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    showDialog();
}

/**
 * @throws NotFoundException
 */
private void showDialog() throws NotFoundException {
    new AlertDialog.Builder(this)
            .setTitle(getResources().getString(R.string.ClearCookies))
            .setMessage(
                    getResources().getString(R.string.ClearCookieQuestion))
            .setIcon(
                    getResources().getDrawable(
                            android.R.drawable.ic_dialog_alert))
            .setPositiveButton(
                    getResources().getString(R.string.PostiveYesButton),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            //Do Something Here

                        }
                    })
            .setNegativeButton(
                    getResources().getString(R.string.NegativeNoButton),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            //Do Something Here
                        }
                    }).show();
}}

Comme indiqué précédemment, il existe plusieurs façons de procéder. c'est l'une des façons dont vous pouvez faire votre tâche, veuillez accepter la réponse si vous sentez que vous avez obtenu ce que vous vouliez.

PravinDodia
la source
Merci! C'est presque exactement ce dont j'avais besoin pour mon application puisque je déclenche le dialogue à partir d'un service et dans mon cas, j'ai besoin d'une activité pour héberger le dialogue.
Ralph Ritoch
Aimer. IMHO la manière verbeuse, mais approuvée et correcte
John