2013-04-09 4 views
7

Ich habe eine Android-App, die einige benutzerdefinierte Dialoge verwendet, die von XML-Layouts aufgeblasen werden. Der Inhalt der Ansicht des Dialogfelds stammt aus dem XML-Layout, aber die eigentlichen positiven und negativen Schaltflächen werden durch Aufrufen der setPositiveButton- und setNegativeButton-Methoden des Builders hinzugefügt, sodass ich das Styling nicht steuern kann (oder zumindest nicht beherrschen kann) der Knöpfe selbst.So legen Sie die Schriftgröße für Text von Dialogfeldern fest

Siehe die onCreateDialog-Methode unten aus meiner LoginConfirmationDialog.java-Datei, die DialogFragment erweitert. Es erscheint im Grunde ein sehr einfacher Dialog, der nach der Bestätigung fragt, wer sich anmeldet (d. H. "Bist du Joe Schmoe?", Mit den Schaltflächen Ja und Nein).

Das XML-Layout hat in diesem Fall nur einen TextView, und um das zu vereinfachen (weil die Benutzer Bauarbeiter mit großen knorrigen schmutzigen Fingern sind, die großen Text und große Schaltflächen benötigen), habe ich die Schriftart für das TextView erstellt ziemlich groß. Die beiden Schaltflächen haben jedoch eine viel kleinere Schriftart für ihren Text, und da sie nicht Teil meines Layouts sind und mit den Methoden setPositiveButton und setNegativeButton hinzugefügt werden, wie kann ich die Schriftgröße steuern?

@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

zu erhalten, da Sie bereits eine XML-Datei für den Dialog mit, warum nicht nur die beiden Tasten im Layout enthalten und stellen Sie die 'onClick' Handler in der Dialogerstellung? – jnthnjns

+0

Ich denke, das ist ein guter Punkt. Ich mag es, die Standardschaltflächen für das Look and Feel zu verwenden, das man mit ihnen bekommt, aber ich denke, ich könnte die Buttons direkt zum Layout hinzufügen und die Listener darauf einstellen. – Jim

+1

alternativer Ansatz ist in dieser Frage zur Verfügung gestellt [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 –

Antwort

28

Statt builder.create() zurückzukehren, versuchen 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

Da Sie bereits eine XML-Datei für den Dialog verwenden, warum nicht einfach die beiden Schaltflächen in das Layout einfügen und die onClick Handler in der Dialogerstellung festlegen, sollte so etwas funktionieren. Ich benutze etwas ähnliches.

Hier ein kurzes Beispiel ist:

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

ich auch die folgenden der Verwendung für die Einstellung Textgrößen ganz lieb bin, kann dies für Größen verschiedene Bildschirm eine andere Größe von Text zu erhalten (Sie können spielen mit dem float Wert an Ihre Bedürfnisse anpassen):

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

+1. Dies ist auch eine gute Antwort. Ich ging mit der Lösung von Ssantos für diesen einen speziellen Fall, an dem ich arbeitete, aber in Zukunft werde ich wahrscheinlich auch Ihre Lösung verwenden; vor allem, wenn ich möchte, dass die Schaltflächen anders angeordnet sind als die Standarddialogfelder. – Jim

4

dauerte eine Weile, Asok Antwort zu integrieren, da ich anonyme innere Klassen für Tasten verwendet, so brauchte ich um die Knopfreferenzen zu verstehen. Das funktioniert. Stellen Sie sicher, dass es nach dem messageDialog.show() Linie geht:

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

Hinweis: Es wird empfohlen SP als eine Einheit für die Textgröße zu verwenden. Im Gegensatz zu px ist es unabhängig von der Gerätedichte.

0

Mein Ansatz ist es, die Tasten in onResume() und konfiguriert, dass sie dort

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