TextView - programowe ustawienie rozmiaru tekstu wydaje się nie działać

140

Używam Eclipse Indigo, testuję na 2 emulatorach (2.2 i 3.0).

poniższy kod pokazuje, co teraz testuję, jednak ustawienie rozmiaru tekstu nie ujawnia niczego na ekranie podczas próby uruchomienia emulatora (jeśli zakomentuję rozmiar tekstu, tekst pojawi się na czerwono). Pomyślałem, że w jakiś sposób eclipse nie odbudowuje kodu, ale dodałem wiersz kodu, aby dodać niebieskie tło i to zadziałało. Próbowałem ustawić rozmiar tekstu po ustawieniu tekstu, ale nadal bezskutecznie. kod jest poniżej. dzięki za pomoc! (zastrzeżenie) - staram się trzymać z dala od XML. Ponieważ znam już Javę, nie chcę na tym polegać.

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;

public class TestAndroidvs2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView text = new TextView(this);
    text.setTextColor(Color.RED);
    text.setTextSize(2);    
    text.setBackgroundColor(Color.BLUE);
    text.setText("Hello Android");


    setContentView(text);
  }
}
cspam
źródło

Odpowiedzi:

19

Rozmiar tekstu 2 będzie praktycznie niewidoczny. Wypróbuj przynajmniej z 14. BTW, używanie XML ma wiele zalet i ułatwi Ci życie, gdy będziesz musiał zrobić coś bardziej złożonego niż „Hello World”.

Nikolay Elenkov
źródło
Spróbuję z 14. Jak powiedziałem w pierwszym poście - nawet jeśli 2 jest za małe, to nie powinno sprawić, że mój ekran stanie się pusty, prawda? Wydaje mi się, że czytałem to jako skalę wykraczającą poza to, czym już był tekst, zamiast po prostu ustawić rozmiar. - popatrzę, ale i tak zapytam - jaki jest domyślny rozmiar? w każdym razie dzięki.
cspam
btw - tak, zdaję sobie sprawę, że XML może mieć swoje zalety, ale nie mam z nim żadnego doświadczenia. Tak, wiem, że jest to prawdopodobnie łatwe do nauczenia. Ponieważ javę już znam, pomyślałem, że naprawdę przydatne byłoby zapoznanie się z jak największą liczbą klas. Wygląda na to, że używanie XML-a wiele z tego ukrywa przed tobą.
cspam
Nie ukrywa tego - to te same klasy o takich samych parametrach. Tłumaczenie między nimi zajmuje trochę czasu, ale w rzeczywistości jest dość wydajne. Jako bonus, jeśli zdefiniujesz widoki w XML, system zajmie się różnymi rozmiarami ekranu, gęstością i orientacją, bez konieczności zmiany kodu, tylko pliki układu.
Nikolay Elenkov,
czy byłbyś w stanie zmienić układy i orientacje w czasie wykonywania w oparciu o dowolną liczbę czynników?
cspam
To bardzo szerokie pytanie, ale krótko mówiąc, tak. Nawet jeśli zdefiniujesz swój interfejs użytkownika w XML, nadal możesz dodawać / usuwać widoki w czasie wykonywania. Możesz także nadpisać domyślne zachowanie i samodzielnie obsłużyć zmiany orientacji.
Nikolay Elenkov
535

metoda TextView.setTextSize(int unit , float size);przyjmuje dwa parametry.

Spróbuj tego :

text.setTextSize(TypedValue.COMPLEX_UNIT_SP,14);

odnieść to i to .

UPDATE: Teraz setTextSize(float size)będzie ustawić rozmiar tekstu automatycznie w „ scaled pixeljednostkach”. nie ma potrzeby, aby ręcznie wymieniać COMPLEX_UNIT_SP. Zapoznaj się z dokumentacją .

Houcine
źródło
36
To jest poprawna odpowiedź. Dokładniej: float myTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 18F, context.getResources().getDisplayMetrics());
Brill Pappin
2
Dziękuję Ci bardzo!
DmitryKanunnikoff
72

To rozwiązało problem. Mam jednolity rozmiar czcionki na wszystkich urządzeniach.

 textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,getResources().getDimension(R.dimen.font));
Vikas
źródło
Czy numer R.dimen.font jest jednolity lub masz różne rozmiary dla różnych urządzeń?
The_Martian
W moim przypadku zadeklarowałem czcionkę w plikach dimen.xml w tych folderach: values, values-sw600dp, values-sw720dp z określonymi wartościami.
Vikas,
to dziwne, że TextView zniknął po wywołaniu textView.setTextSize (R.dimen.text_size_max), ale użyj swojej metody, to działa.
li2
Pracuje dla mnie. Dziękuję Ci!
apurv thakkar
24

Obecnie setTextSize(float size)metoda będzie działać dobrze, więc nie musimy używać innej metody zmiany rozmiaru tekstu

Kod źródłowy android.widget.TextView.java

/**
 * Set the default text size to the given value, interpreted as "scaled
 * pixel" units.  This size is adjusted based on the current density and
 * user font size preference.
 *
 * <p>Note: if this TextView has the auto-size feature enabled than this function is no-op.
 *
 * @param size The scaled pixel size.
 *
 * @attr ref android.R.styleable#TextView_textSize
 */
@android.view.RemotableViewMethod
public void setTextSize(float size) {
    setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}

Przykład użycia

textView.setTextSize(20); // set your text size = 20sp
Phan Van Linh
źródło
Link do źródła AOSP TextView
Albert Vila Calvo,
12

Zobacz ten link, aby uzyskać więcej informacji na temat ustawiania rozmiaru tekstu w kodzie. Zasadniczo mówi:

public void setTextSize (jednostka int, rozmiar zmiennoprzecinkowy)

Od: API Level 1 Ustaw domyślny rozmiar tekstu na podaną jednostkę i wartość. Zobacz TypedValue, aby zapoznać się z możliwymi jednostkami wymiarów. Powiązane atrybuty XML

android: textSize Parametry

jednostka Pożądana jednostka wymiaru.
rozmiar Żądany rozmiar w podanych jednostkach.

Jacek
źródło
1
Właśnie dwukrotnie sprawdziłem Eclipse w moim kodzie i zgodnie z intelisense mam 2 opcje setTextSize, setTextSize (rozmiar zmiennoprzecinkowy), setTextSize (jednostka int, rozmiar zmiennoprzecinkowy). Potwierdza to dołączona dokumentacja.
cspam
Racja - próbowałeś tego? Również Nikolay mówi, że 2 będzie DUŻO za małe do zobaczenia, spróbuj również zwiększyć.
Jack,
tak, ale problem polega na tym, że kiedy próbuję to zrobić tak, jak mam to teraz, tekst nawet się nie pojawia. to tylko pusty ekran. Nawet jeśli 2 nie było zauważalne, dlaczego ekran jest pusty?
cspam
To nie jest puste. Jeśli przyjrzysz się naprawdę blisko, zobaczysz małe czerwone piksele :). Zwiększaj rozmiar stopniowo, aby zobaczyć.
Nikolay Elenkov,
A tak przy okazji, setTextSize (float) jest odpowiednikiem setTextSize (COMPLEX_UNIT_SP, float).
Nikolay Elenkov,
10

W moim przypadku zastosowałem tę metodę :

public static float pxFromDp(float dp, Context mContext) {
    return dp * mContext.getResources().getDisplayMetrics().density;
}

Tutaj ustawia TextSize TextView programowo :

textView.setTextSize(pxFromDp(18, YourActivity.this));

Ciesz się :)

Dhruv Raval
źródło
Cześć @Dhruv Raval, odbieram, aby móc dostosować rozmiar czcionki w moim projekcie, na wypadek, gdyby ta wartość 18 była ważna dla dowolnej gęstości ekranu, czy powinienem utworzyć wymiar dla każdego ekranu?
Armando Marques Sobrinho