2013-04-09 16 views
7

Ho un'app per Android che utilizza alcune finestre di dialogo personalizzate che vengono gonfiate dai layout XML. I contenuti della vista della finestra di dialogo provengono dal layout XML, ma i pulsanti positivi e negativi vengono aggiunti chiamando i metodi setPositiveButton e setNegativeButton del builder, quindi non ho il controllo su (o almeno non so come controllare) lo stile dei pulsanti stessi.Come impostare la dimensione del carattere per il testo dei pulsanti di dialogo

Vedere il metodo onCreateDialog di seguito dal file LoginConfirmationDialog.java che estende DialogFragment. Fondamentalmente apre una finestra di dialogo molto semplice che richiede la conferma di chi sta effettuando l'accesso (ad es. "Sei Joe Schmoe?", Con i pulsanti Sì e No).

Il layout XML in questo caso ha solo una singola TextView, e per semplificare (perché gli utenti saranno lavoratori edili con grandi dita sporche e nodose che hanno bisogno di testo grande e pulsanti grandi), ho creato il font per TextView bello grosso. I due pulsanti hanno un carattere molto più piccolo per il loro testo, e dal momento che non fanno parte del mio layout e vengono aggiunti con i metodi setPositiveButton e setNegativeButton, come posso controllare la dimensione del carattere?

@Override  
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    Bundle args = this.getArguments(); 

    String empName = args.getString("empName");   

    // Use the Builder class for convenient dialog construction   
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_login_confirmation, null); 

    TextView message = (TextView)view.findViewById(R.id.txtLoginConfirmationMessage); 
    message.setText("Are you " + empName + "?"); 

    builder.setView(view);  

    builder.setPositiveButton("Yes", 
      new DialogInterface.OnClickListener() {     
       public void onClick(DialogInterface dialog, int id) { 
        mListener.onEmpConfirmPositiveClick(LoginConfirmationDialog.this); 
       }    
      });    
    builder.setNegativeButton("No", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        mListener.onEmpConfirmNegativeClick(LoginConfirmationDialog.this); 
       } 
      }); 

    // Create the AlertDialog object and return it   
    return builder.create();  
} 
+0

Dal momento che si sta già utilizzando un file xml per la finestra perché non basta includere i due pulsanti nel layout e impostare il 'onClick' gestori nella creazione di una finestra di dialogo? – jnthnjns

+0

Suppongo che sia un buon punto. Mi piace usare i pulsanti predefiniti per l'aspetto che si ottiene con loro, ma suppongo che potrei aggiungere i pulsanti direttamente al layout e impostare gli ascoltatori su di essi. – Jim

+1

approccio alternativo è fornito in questa domanda [http://stackoverflow.com/questions/8881710/how-to-reduce-alertdialog-builder-title-font-size-and-positive-button-size] [ 1] [1]: http://stackoverflow.com/questions/8881710/how-to-reduce-alertdialog-builder-title-font-size-and-positive-button-size –

risposta

28

Invece di tornare builder.create(), provare this.-

final AlertDialog alert = builder.create(); 
alert.setOnShowListener(new DialogInterface.OnShowListener() { 
    @Override 
    public void onShow(DialogInterface dialog) { 
     Button btnPositive = alert.getButton(Dialog.BUTTON_POSITIVE); 
     btnPositive.setTextSize(TEXT_SIZE); 

     Button btnNegative = alert.getButton(Dialog.BUTTON_NEGATIVE); 
     btnNegative.setTextSize(TEXT_SIZE); 
    } 
}); 

return alert; 
3

Poiché si sta già utilizzando un file XML per la finestra di dialogo, perché non includere solo i due pulsanti nel layout e impostare i gestori onClick nella creazione della finestra di dialogo, qualcosa di simile dovrebbe funzionare. Sto usando qualcosa di simile.

Ecco un rapido esempio:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_login_confirmation, null); 

TextView message = (TextView)view.findViewById(R.id.txtLoginConfirmationMessage); 
message.setText("Are you " + empName + "?"); 

Button positiveBtn = (Button) view.findViewById(R.id.dialogButtonPositive); 
    // Set size of button in relation to screen size 
    positiveBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) 25); 
    positiveBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mListener.onEmpConfirmPositiveClick(LoginConfirmationDialog.this); 
     } 
    }); 

Button negativeBtn = (Button) view.findViewById(R.id.dialogButtonNeg); 
// Set size of button in relation to screen size 
negativeBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) 25); 
negativeBtn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     mListener.onEmpConfirmNegativeClick(LoginConfirmationDialog.this); 
    } 
}); 

builder.setView(view); 
return builder.create(); 

Sono anche molto affezionato utilizzando il seguente per impostare le dimensioni del testo, questo permette di varie dimensioni dello schermo per ottenere una diversa dimensione di testo (È possibile giocare con il valore float in base alle proprie esigenze):

.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) 25); 
+2

+1. Questa è anche un'ottima risposta. Sono andato con la soluzione di ssantos per questo caso specifico su cui stavo lavorando, ma in futuro userò probabilmente anche la tua soluzione; soprattutto se voglio che i pulsanti siano disposti in modo diverso rispetto ai pulsanti di dialogo predefiniti. – Jim

4

ho messo un po ', per integrare la risposta di Asok, da quando ho usato classi interne anonime per i pulsanti, quindi avevo bisogno per ottenere una maniglia sui riferimenti dei pulsanti. Questo funziona. Assicurarsi che va dopo la linea messageDialog.show():

messageDialog.show(); 
messageDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextSize(TypedValue.COMPLEX_UNIT_SP, 25.0f); 
messageDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextSize(TypedValue.COMPLEX_UNIT_SP, 25.0f); 

Nota: Si consiglia di utilizzare sp come unità per le dimensioni del testo. A differenza di px, è indipendente dalla densità del dispositivo.

0

Il mio approccio è quello di ottenere i pulsanti nella onResume() e configurarli ci

public class LoginConfirmationDialog extends DialogFragment { 

    @Override  
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // your code here remains unchanged 
    } 

    @Override 
    public void onResume() { 
    super.onResume(); 

    Button positiveButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE); 
    positiveButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); 

    Button negativeButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_NEGATIVE); 
    negativeButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); 
    } 
} 
Problemi correlati