2011-04-14 29 views
12

Estoy tratando de mostrar un cuadro de diálogo desde el oyente onClick de un botón de otro cuadro de diálogo, pero no se mostrará el segundo cuadro de diálogo. Busqué y encontré un problema similar: Dialogs order in Android, intenté con la solución provista, pero incluso eso no funciona.Android muestra otro cuadro de diálogo desde un cuadro de diálogo

Mi código es muy similar al proporcionado en la respuesta.

public void onClick (DialogInterface de diálogo, int id) { showDialog (SECOND_DIALOG); dialog.dismiss(); }

cualquier ayuda será muy apreciada.

Gracias,

Akshay

Respuesta

8

Así es como lo estoy haciendo:

if (!appPrefs.getAcceptedUsageAggrement()) { 
     tracker.trackPageView("/UsageAgreementDialog"); 
     acceptedUsage_alertDialog = new AlertDialog.Builder(BroadcastSMSActivity.this) 
     .setTitle(R.string.accept_usage_title) 
     .setMessage(R.string.accept_usage_message) 
     .setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }) 
     .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       if (appPrefs.getAppVer().equals("")) { 
        tracker.trackEvent("Application", "Install", getAppVerName(), 1); 
       } else { 
        tracker.trackEvent("Application", "Upgrade", appPrefs.getAppVer().toString()+"->"+getAppVerName(), 1); 
       } 
       displayRecentChanges = true; 
       appPrefs.saveAppVer(getAppVerName()); 
       appPrefs.saveAcceptedUsageAggrement(true); 
      // Display Recent Changes on 1st use of new version 
       if (displayRecentChanges) { 
        tracker.trackPageView("/RecentChangesDialog"); 
        recentChanges_alertDialog = new AlertDialog.Builder(BroadcastSMSActivity.this) 
        .setTitle(getString(R.string.changes_title, getAppVerName())) 
        .setMessage(R.string.changes_dialog) 
        .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          recentChanges_alertDialog.cancel(); 
          acceptedUsage_alertDialog.cancel(); 
         } 
        }) 
        .create(); 
        recentChanges_alertDialog.show(); 
       } 
      } 
     }) 
     .create(); 
     acceptedUsage_alertDialog.show(); 
    } 
+1

Thanks Bill! ¡Esto funciona! Aparentemente, llamar a showDialog() del contexto de actividad no lo hace. – Akshay

+0

No estoy seguro de haber aceptado Uageage_alertDialog.cancel(); en el lugar correcto, pero puedo decirte que cuando lo cancelé onClick() y luego intenté crear el cuadro de diálogo siguiente, causó un cierre forzado. Por lo tanto, me pareció natural simplemente mover su .cancel() justo después del segundo diálogo cancelar(). –

+0

También podría notar un par de trucos geniales de Google Analytics allí ... Estoy grabando si esta ejecución de la aplicación fue una nueva instalación o una actualización. Si se trata de una actualización, estoy grabando la versión de la que provienen y la versión que se está instalando: 1.5-> 1.8, etc. –

1

mi sugerencia es este código. el cuadro de diálogo 1 tiene un botón al hacer clic en él y luego llamará al cuadro de diálogo 2.

private Dialog dialog; 
    private AlertDialog.Builder voteBuilder; 

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

    // Firat dialog 
      dialog = new Dialog(QrCodeReader.this); 
      dialog.setContentView(R.layout.customdialog_qr); 
      dialog.setCancelable(false); 

    // Second dialog 
      showVotingDialog(); 

    //set up button of dialog 1 
      Button btnVote = (Button) dialog.findViewById(R.id.btnVote); 
      btnVote.setOnClickListener(new OnClickListener() { 
      @Override 
       public void onClick(View v) { 
        dialog.dismiss(); 
        voteBuilder.show(); 
       } 
      }); 

dialog.show(); 
    } 

    private void showVotingDialog() { 
      voteBuilder = new AlertDialog.Builder(this); 
      voteBuilder.setTitle(R.string.votingdialog_title); 
      voteBuilder.setCancelable(false); 
      LayoutInflater inflater = getLayoutInflater(); 
      final View checkboxLayout = inflater.inflate(R.layout.voting_dialog, null); 
      voteBuilder.setView(checkboxLayout); 
      voteBuilder.setPositiveButton(R.string.menu_ok, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        RadioGroup radioGroup = (RadioGroup) checkboxLayout.findViewById(R.id.vote_radiogroup); 
        int checkedRadioButton = radioGroup.getCheckedRadioButtonId(); 
        int radioButtonSelected = 0; 
        switch (checkedRadioButton) { 
         case R.id.vote_item1 : radioButtonSelected = 1; break; 
         case R.id.vote_item2 : radioButtonSelected = 3; break; 
         case R.id.vote_item3 : radioButtonSelected = 5; break; 
         case R.id.vote_item4 : radioButtonSelected = 10; break; 
         case R.id.vote_item5 : radioButtonSelected = 20; break; 
         default: radioButtonSelected = 0; 
        } 

        sendVoteBySMS(radioButtonSelected); 
       } 
      }); 
      voteBuilder.setNegativeButton(R.string.menu_cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        QrCodeReader.this.finish(); 
       } 
      }); 

      voteBuilder.create(); 
    //  voteBuilder.show(); 
     } 
5

Sé que esto fue preguntado hace un tiempo, pero esta es una solución muy buena que encontré.

que definen una interfaz de la siguiente manera:

public interface OpenDialog { 

public void showDialog(DialogFragment dialog); 

} 

Qué mi actividad a continuación, implementos, pasando una referencia a sí mismo al cuadro de diálogo cuando se abre, usando mi clase InterfaceHolder:

public class MyActivity extends FragmentActivity implements OpenDialog { 

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

    InterfaceHolder.set(this);   
    showDialog(new DialogOne()); 

} 

public void showDialog(DialogFragment dialog) { 
    dialog.show(getSupportFragmentManager(), "tag"); 
} 

InterfaceHolder es solo una clase con una referencia estática a la interfaz que uso para pasarla:

public class InterfaceHolder { 
private static OpenDialog openDialog; 

public void set(OpenDialog openDialog) 
    this.openDialog = openDialog; 
} 

public void get() 
    return openDialog; 
} 

Entonces, el método showDialog mostrará cualquier diálogo que pase a él; como puede ver, hago esto para mostrar DialogOne. Ahora, si quiero abrir un nuevo cuadro de diálogo llamado "DialogTwo" "DialogOne" dentro de lo que puedo llamarlo por escrito:

InterfaceHolder.get().showDialog(new DialogTwo()); 
dismiss(); 

y listo, se muestra DialogTwo. Obviamente, debes tener cuidado para asegurarte de que se haya pasado una referencia a tu actividad al InterfaceHolder (una buena manera de hacer esto es poner InterfaceHolder.set (this) dentro del método showDialog), pero de lo contrario esto parece funcionar hermosamente.

-3

Solo ocultar y mostrar las vistas en los clics del cuadro de diálogo

+0

por favor agregue un comentario para eso. No hay necesidad de dar una respuesta para eso –

Cuestiones relacionadas