2012-12-19 12 views
8

Ho un AlertDialog con 2 pulsanti. Voglio che riproducano il mio suono personalizzato quando vengono cliccati. Così ho questo codice su ogni pulsante:Come disabilitare l'effetto sonoro di sistema su AlertDialog?

SoundUtility.getInstance(Add_Edit_Note.this).playPositive(); 

SoundUtility è una classe che ho scritto per riprodurre i suoni personalizzati. Ecco il problema: suona il mio suono personalizzato, ma allo stesso tempo suona anche l'effetto sonoro del sistema, quindi ho due suoni che suonano allo stesso tempo. Sono stato in grado di disattivarlo sui pulsanti regolari riscrivendo il pulsante:

public class AppButton extends Button { 

public AppButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // Disable sound effect 
    this.setSoundEffectsEnabled(false); 
} 

} 

e poi nel mio file XML:

<com.my.app.AppButton 
    ... /> 

ma non riesco a trovare un modo per disattivare questi effetti sonori del sistema sui pulsanti AlertDialog. Eventuali suggerimenti?

EDIT

Come richiesto, questo è il codice SoundUtility:

public class SoundUtility { 
private static SoundUtility soundInstance; 
private MediaPlayer mpPositive; 
private MediaPlayer mpNegative; 

public static SoundUtility getInstance(Context context){ 

    if(soundInstance==null) 
    { 
     soundInstance = new SoundUtility(context); 
    } 

    return soundInstance; 
} 

private SoundUtility (Context context) 
{ 
    mpPositive = MediaPlayer.create(context, R.raw.click_positive); 
    mpNegative = MediaPlayer.create(context, R.raw.click_negative); 
} 

// Playing positive sound 
public void playPositive() { 
    mpPositive.start(); 
} 

// Playing negative sound 
public void playNegative() { 
    mpNegative.start(); 
} 

// Releasing MediaPlayer 
public void releaseMediaPlayer() { 
    mpPositive.release(); 
    mpNegative.release(); 
} 

}

EDIT 2

Il codice del mio AlertDialog:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("Are you sure you want to cancel?") 
     .setCancelable(false) // The dialog is modal, a user must provide an answer 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      // If the answer is Yes 
      public void onClick(DialogInterface dialog, int id) { 
       ... 
       setResult(RESULT_CANCELED); // Setting result as cancelled and returning it to main activity 
       SoundUtility.getInstance(Add_Edit_Note.this).playPositive(); // Play positive sound 
       Add_Edit_Note.this.finish(); // Closing current activity 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() { 
      // If the answer is No 
      public void onClick(DialogInterface dialog, int id) { 
       SoundUtility.getInstance(Add_Edit_Note.this).playNegative(); // Play negative sound 
       dialog.cancel(); // Closing the confirmation dialog 
      } 
     }); 
builder.create().show(); // Present the dialog to the user 
+0

Penso che dovresti postare il codice per la tua classe SoundUtility, deve giocare questo effetto sonoro di sistema da qualche parte. – breadbin

+0

@breadbin Inserito il codice SoundUtility. Ma in realtà non c'è niente che suoni l'effetto sonoro del sistema, solo i miei suoni personalizzati ... – Igal

risposta

6

Prova questo

Button btn = dialog.getButton(Dialog.BUTTON_POSITIVE); 
btn.setSoundEffectsEnabled(false); 

chiamata setSoundEffectsEnabled per tutti i pulsanti che avete

EDIT:

Invece di

builder.create().show(); 

uso

AlertDialog dialog = builder.create(); 
dialog.show(); 

Button btn = dialog.getButton(Dialog.BUTTON_POSITIVE); 
btn.setSoundEffectsEnabled(false); 

Button btn2 = dialog.getButton(Dialog.BUTTON_NEGATIVE); 
btn2.setSoundEffectsEnabled(false); 
+0

Dove dovrei posizionare esattamente questo codice? L'ho provato nel metodo onClick del Dialog, ma ho ricevuto un errore, dicendo "Il metodo getButton (int) non è definito per il tipo DialogInterface". Ho provato a lanciare la finestra di dialogo 'dialog' in '((AlertDialog) .getButton', si è sbarazzata del messaggio di errore, ma avevo ancora quell'effetto sonoro di sistema. – Igal

+0

posizionalo dopo aver creato la finestra di dialogo e subito prima di mostrare. Inserisci anche il codice in cui stai creando la finestra di dialogo, dovresti cambiare BUTTON_POSITIVE con qualsiasi tipo di pulsante che stai usando – nandeesh

+0

Ancora senza fortuna ... Ho aggiornato la domanda con il mio codice AlertDialog, dove inserisco questo codice? – Igal

1

sono stato in grado di spegnere il feedback audio a livello globale mettendo android:soundEffectsEnabled=false in un tema.

È possibile applicare il tema all'intera applicazione dal file manifest.

Way Alternativa:

È possibile creare una classe e utilizzarlo in file di layout ...

tua Classe:

package com.me.customeapp 

public class MeTextView extends TextView { 

    public MeTextView (Context context, AttributeSet attrs) { 
     this.setSoundEffectsEnabled(false); 
    } 
} 

Dentro il file XML mettere sotto il codice:

<com.me.customeapp.TextView 
... 
</com.me.customeapp.TextView> 

Provalo. Spero ti possa aiutare.

+0

Non ho mai usato i file dei temi ... Dove lo trovo? – Igal

+0

È possibile applicare il tema all'intera applicazione dal file manifest –

+0

Ho aggiornato il mio post. è possibile rivederlo –

Problemi correlati