2011-07-22 33 views
60

Các official documentation dường như không trả lời điều này, hoặc tôi không thể tìm ra.Sự không nhất quán khi thiết lập kích thước phông chữ TextView trong mã và trong tài nguyên

Element (nevermind các AlertDialog, nó sẽ xảy ra trên bất kỳ TextView cũng):

TextView tv = (TextView) dialog.findViewById(android.R.id.message); 

Sự mâu thuẫn. Trường hợp A:

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); 
// or tv.setTextSize(14); does the same 

trường hợp B:

tv.setTextSize(getResources().getDimension(R.dimen.text_size_small)); 
// TypedValue makes no difference either. 

nơi values/dimens.xml có nó:

<dimen name="text_size_small">14sp</dimen> 

Kết quả: kích thước phông chữ là không giống nhau, và dường như lớn hơn nhiều khi lấy từ tài nguyên. Tôi có thể thiếu một cái gì đó, vậy sai lầm của tôi là gì, và điều quan trọng nhất là: tại sao?

- Update để trả lời đầu tiên -

Số cố định đã được chỉ là một ví dụ, như ai sẽ cứng mã cố định cỡ chữ trong mã. Vì vậy, hãy để tôi thuật lại câu hỏi:

Tại sao nếu tôi lấy tài nguyên từ mã, kích thước văn bản lớn hơn khi tôi lấy tài nguyên từ bố cục XML? Bên cạnh đó, câu hỏi vẫn như cũ: làm thế nào để lấy một đơn vị 14sp trong mã và giữ nó phù hợp với đơn vị 14sp được đặt trong XML bố cục? Tôi không chấp nhận câu trả lời vì nó không cho tôi biết cách sử dụng đơn vị sp từ tài nguyên trong mã cho kích thước văn bản.

On bố trí này, kích thước phông chữ là khác nhau, ngay cả khi kích thước là như nhau:

<TextView 
      android:id="@+id/my_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      style="@style/TextBody" /> 

styles.xml:

<style name="TextBody"> 
    <item name="android:textSize">@dimen/text_size_small</item> 
    <item name="android:lineSpacingMultiplier">1.1</item> 
    <item name="android:textColor">@color/body_text_1</item> 
    <item name="android:textIsSelectable">true</item> 
    <item name="android:linksClickable">true</item> 
</style> 

Xem text_size_small đó? Tại sao trong trường hợp này kích thước phông chữ nhỏ hơn trong mã, sử dụng cùng một tài nguyên dimen?

+0

Cảm ơn bạn đã nâng cao vấn đề này. Tôi cũng nhận được nó trong dự án của tôi. – anticafe

Trả lời

102

Bạn nên sử dụng setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); vì tài liệu của phương pháp getDimension khẳng định rằng nó trả về một Resource dimension value multiplied by the appropriate metric. mà tôi hiểu là precalculated giá trị px tuyệt đối.

Đó là, sử dụng:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small)); 
+0

Cảm ơn bạn. Tôi đoán đó là những gì Nikola đã cố gắng để nói (bây giờ tôi thấy nó), nhưng lời giải thích của bạn làm cho tôi hiểu được gốc rễ của vấn đề. – davidcesarino

2

của nó là vấn đề sppxdpi

tv.setTextSize(14) = 14 pixels 
+0

Đó chỉ là một ví dụ ... Tôi sẽ không sử dụng các đơn vị mã hóa cứng trong mã. Tôi đã cập nhật câu hỏi của mình để làm rõ. Vấn đề là tôi nhận được kích thước phông chữ không phù hợp từ cùng một tài nguyên, tùy thuộc vào việc tôi đang truy xuất trong bố cục hay trong mã. Đó là vấn đề tôi đang cố giải quyết. – davidcesarino

22

Bằng cách nào đó điều này dường như phù hợp:

XML:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="typo14">9sp</dimen> 
</resources> 

Java:

setTextSize(TypedValue.COMPLEX_UNIT_SP, 9); 
setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.typo14)); 
+1

Cảm ơn mã của bạn đã trình bày rất trực quan giải pháp. Nói chung, đây là bản chất những gì maxmc đã nói ... bằng cách sử dụng 'setTextSize' với các đơn vị pixel khi truy xuất từ ​​các tài nguyên. – davidcesarino

+0

Tôi có một điều khiển tùy chỉnh có tập hợp 'textSize' bằng cách sử dụng' sp'. Khi bạn nhận được giá trị đó bằng cách sử dụng 'getDimensionPixelSize', nó sẽ được chuyển đổi thành pixel. Sau đó, khi kích thước văn bản được thiết lập, nó mặc định là 'sp' (hoặc một số như vậy) để kích thước quá lớn. Điều này đã giúp rất nhiều. – JeffRegan

Các vấn đề liên quan