Como implementar uma DialogPreference de confirmação (sim / não)?

Respostas:

292

Essa é uma caixa de diálogo de alerta simples , Federico deu a você um site onde você pode pesquisar coisas.

Aqui está um pequeno exemplo de como um diálogo de alerta pode ser criado.

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
fonte
3
Eu sei como construir um Dialog, mas meu q sobre preferências.
sh1ng
1
Sua pergunta é sobre preferências? OK. Dê uma olhada aqui: kaloer.com/android-preferences
Maaalte
1
Já li esta fonte. Posso criar uma preferência personalizada inscrita no OnClick e lidar com isso, mas é a maneira mais fácil?
sh1ng
Acho que sim, pelo menos não conheço outra maneira que seja mais fácil.
Maaalte
1
use import android.support.v7.app.AlertDialog; para uma aparência melhor sem um tema
mais do que
9

O Android vem com uma classe YesNoPreference integrada que faz exatamente o que você deseja (uma caixa de diálogo de confirmação com opções sim e não). Veja o código-fonte oficial aqui .

Infelizmente, ele está no com.android.internal.preferencepacote, o que significa que é parte das APIs privadas do Android e você não pode acessá-lo de seu aplicativo (classes de API privadas estão sujeitas a alterações sem aviso prévio, daí o motivo pelo qual o Google não permite seu acesso).

Solução: basta recriar a classe no pacote do seu aplicativo copiando / colando o código-fonte oficial do link que forneci. Eu tentei isso e funciona bem (não há razão para que não deva).

Você pode então adicioná-lo à sua preferences.xmlpreferência como qualquer outra. Exemplo:

<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" />

Que se parece com isto:

captura de tela

XåpplI'-I0llwlg'I -
fonte
1
Ótima solução! Mas há um problema com um dos construtores desta classe! Ele faz referência a um recurso attr (com.android.internal.R.attr.yesNoPreferenceStyle)! Que não pode ser resolvido. Qual é a solução alternativa? Tenho que criar um no meu próprio projeto ?!
Reubenjohn
3

Use a preferência de intenção se estiver usando uma tela xml de preferência ou se estiver usando uma tela personalizada, o código seria como abaixo

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

E, em seguida, crie a classe de atividade mais ou menos como a seguir, Como pessoas diferentes e abordagens diferentes, você pode usar qualquer abordagem que desejar, este é apenas um exemplo.

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

Como dito antes, existem várias maneiras de fazer isso. esta é uma das maneiras de realizar sua tarefa. Aceite a resposta se achar que conseguiu o que queria.

PravinDodia
fonte
Obrigado! Isso é quase exatamente o que eu precisava para meu aplicativo, já que estou disparando a caixa de diálogo de um serviço e, no meu caso, preciso de uma atividade para hospedar a caixa de diálogo.
Ralph Ritoch
Adoro. IMHO a forma verbosa, mas aprovada e correta
John