2013-04-09 11 views
7

Mam aplikację na Androida, która korzysta z niestandardowych okien dialogowych, które są zawyżone w układach XML. Zawartość widoku okna dialogowego pochodzi z układu XML, ale faktyczne przyciski dodatnie i ujemne są dodawane przez wywołanie metod setPositiveButton i setNegativeButton, więc nie mam kontroli nad (lub przynajmniej nie wiem, jak kontrolować) stylizacji samych przycisków.Jak ustawić rozmiar czcionki dla tekstu przycisków dialogowych?

Zobacz metodę onCreateDialog poniżej z mojego pliku LoginConfirmationDialog.java, który rozszerza DialogFragment. Zasadniczo pojawia się bardzo prosty dialog, który prosi o potwierdzenie, kto się loguje (tj. "Czy jesteś Joe Schmoe?", Z przyciskami Tak i Nie).

Układ XML w tym przypadku ma tylko pojedynczy widok tekstowy, i aby to ułatwić (ponieważ użytkownicy będą pracownikami budowlanymi z dużymi brudnymi palcami, którzy potrzebują dużego tekstu i dużych przycisków), zrobiłem czcionkę dla TextView dość duży. Dwa przyciski mają jednak znacznie mniejszą czcionkę do tekstu, a ponieważ nie są częścią mojego układu i są dodawane za pomocą metod setPositiveButton i setNegativeButton, w jaki sposób mogę kontrolować rozmiar czcionki?

@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

Skoro już używasz pliku xml dla okna dlaczego po prostu nie obejmuje dwóch przycisków w układzie i ustawić 'onClick' procedury obsługi w tworzeniu okna dialogowego? – jnthnjns

+0

Przypuszczam, że to dobra uwaga. W pewnym sensie lubię używać domyślnych przycisków dla wyglądu i stylu, jaki można uzyskać za ich pomocą, ale myślę, że mógłbym dodać przyciski bezpośrednio do układu i ustawić na nich słuchaczy. – Jim

+1

Alternatywne podejście jest w pytaniu [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 –

Odpowiedz

28

Zamiast powrocie builder.create(), spróbuj 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

Ponieważ już używasz pliku xml dla okna dialogowego, dlaczego nie wystarczy po prostu włączyć dwa przyciski w układzie i ustawić narzędzia do obsługi dialogów onClick w oknie dialogowym, coś takiego powinno działać. Używam czegoś podobnego.

Oto krótki przykład:

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

Jestem również bardzo lubiący użyciu następujących ustalania wielkości tekstu, pozwala to na różnych rozmiarów ekranu, aby uzyskać inny rozmiar tekstu (można grać z wartością float do własnych potrzeb):

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

+1. To także świetna odpowiedź. Poszedłem z rozwiązaniem ssantos dla tego konkretnego przypadku, nad którym pracowałem, ale w przyszłości prawdopodobnie użyję twojego rozwiązania; zwłaszcza, jeśli chcę, aby przyciski były ułożone inaczej niż domyślne przyciski dialogowe. – Jim

4

Zajęło mi trochę czasu, aby zintegrować Asok za odpowiedź, ponieważ użyłem anonimowych klas wewnętrznych dla przycisków, więc potrzebowałem aby uzyskać uchwyt odniesień do przycisków. To działa. Upewnij się, że idzie po messageDialog.show() online:

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

Uwaga: Zaleca się używać Sp jako jednostkę do wielkości tekstu. W przeciwieństwie do px, jest on niezależny od gęstości urządzenia.

0

Moje podejście jest uzyskanie przyciski onResume() i skonfigurować je tam

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); 
    } 
} 
Powiązane problemy