Come distriggersre un button all'interno di un AlertDialog? Seguire la domanda

Ho fatto questa domanda di ieri (http://stackoverflow.com/questions/7392321/how-do-you-disable-a-button-inside-of-an-alertdialog) e ha modificato il mio codice di conseguenza … questa mattina ho corso il codice in un emulatore e ha ricevuto un NPE. Ecco il codice:

public void monster() { int playerint = settings.getPlayerInt(); int monsterint = settings.getMonsterInt(); AlertDialog.Builder alertbox = new AlertDialog.Builder(this); alertbox.setMessage("You have Encountered a Monster"); alertbox.setPositiveButton("Fight!", new DialogInterface.OnClickListener() { // do something when the button is clicked public void onClick(DialogInterface arg0, int arg1) { createMonster(); fight(); } }); alertbox.setNeutralButton("Try to Outwit", new DialogInterface.OnClickListener() { // do something when the button is clicked public void onClick(DialogInterface arg0, int arg1) { // This should not be static // createTrivia(); trivia(); } }); // Return to Last Saved CheckPoint alertbox.setNegativeButton("Run Away!", new DialogInterface.OnClickListener() { // do something when the button is clicked public void onClick(DialogInterface arg0, int arg1) { // runAway(); } }); 

QUESTA È QUALORA IL PROBLEMA INIZIA

  • Android - Vista Web, le caselle di input raddoublete?
  • Miglior modo per creare una barra degli strumenti in fondo in android.
  • Come get il chilometro di distanza in android?
  • Il plugin Sendsms non funziona su Phonegap
  • Riempire la canvas completa ma mantenere l'area di riempimento del limite come è cerchio, rettangolo
  • Android: come condividere il codice tra i progetti firmati con lo stesso certificato
  •  // show the alert box alertbox.show(); AlertDialog dialog = alertbox.create(); Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL); if(monsterint > playerint) { button.setEnabled(false); } } 

    Qualcuno sa cosa sto facendo male?

    4 Solutions collect form web for “Come distriggersre un button all'interno di un AlertDialog? Seguire la domanda”

    Hai due problemi. Il primo è che si dovrebbe call show() e create() separatamente come quello. Quello che hai effettivamente fatto è implicitamente creare un AlertDialog e visualizzarlo con alertbox.show() , e subito dopo crea un secondo AlertDialog che utilizzi per manipolare il button. Cerchiamo di mantenere le chiamate dirette al Costruttore al minimo.

    Inoltre, e la ragione più diretta per il tuo crash NPE, in AlertDialog terra i bottoni stessi in realtà non vengono creati fino a quando AlertDialog è pronto per la visualizzazione (in sostanza, dopo che AlertDialog.show() è chiamato … di nuovo, non essere confuso con il metodo AlertDialog.Builder.show() ). Per utilizzare AlertDialog per i tuoi scopi, è necessario get e modificare lo stato del button dopo aver visualizzato la window di dialogo. Ecco una modifica della sezione di codice finale che risolve questo problema:

     //Create the AlertDialog, and then show it AlertDialog dialog = alertbox.create(); dialog.show(); //Button is not null after dialog.show() Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL); if(monsterint > playerint) { button.setEnabled(false); } 

    HTH

    EDIT

    All'inizio ho pensato che il codice dovrebbe leggere:

      AlertDialog dialog = alertbox.create(); Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL); if(monsterint > playerint) { button.setEnabled(false); } dialog.show(); 

    E mi aspetto che questo funziona, comunque non import come cucinare questo codice, la chiamata a getButton (int che) restituisce sempre null.

    Non sembra che ci sia ragione ragionevole. Sono tentato di dire che questo è un bug nell'API. L'ho puntato per il livello API 8.

    AGGIORNARE

    Congratulazioni per aver scoperto Bug Android # 6360 vedi commento # 4 per una soluzione alternativa

    Inoltre potresti dare un'occhiata a un ansible duplicato indiretto di questa domanda

    E la soluzione è call getButton dopo dialog.show() :

      AlertDialog dialog = alertbox.create(); dialog.show(); Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL); if(monsterint > playerint) { button.setEnabled(false); } 

    Il trucco è che è necessario utilizzare l'object AlertDialog AlertDialog.Builder.show() da AlertDialog.Builder.show() . Non è necessario call AlertDialog.Builder.create() .

    Esempio:

      AlertDialog dialog = alertbox.show(); if(monsterint > playerint) { Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL); button.setEnabled(false); } 

    Ho provato questi codice e funziona è necessario hide il primo show ok

     AlertDialog.Builder alertbox = new AlertDialog.Builder(this); alertbox.setMessage("You have Encountered a Monster"); alertbox.setPositiveButton("asdasd", null); alertbox.show(); alertbox.setPositiveButton("", null); alertbox.show(); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.