2011-07-22 3 views
60

official documentationはこれに対応していないようです。コード内とリソース内でTextViewフォントサイズを設定すると一致しない場合

要素(用事AlertDialog、それは同様に任意のTextViewで発生):

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

矛盾。ケースA:

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

ケースB:values/dimens.xmlはそれを持っている

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

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

結果:フォントサイズが同じではなく、リソースから取得する際にはるかに大きい表示されます。私はおそらく何かが欠けているので、私の間違いは何か、そして最も重要なのはなぜですか?

- 最初の回答にUPDATE -

誰もハードコードに固定されたフォントサイズをコーディングしないであろうように固定された数は、単に例でした。だから質問を言い換えてみましょう:

私はコードからリソースを取得する理由は、テキストサイズは、XMLレイアウトからリソースを取得するよりも大きいですか?さらに、質問は同じですが、コード内で14sp単位を取得し、レイアウトXMLで設定されている14sp単位と一貫性を保つにはどうすればよいですか?テキストサイズのコードでリソースからsp単位を使用する方法を教えてくれないので、私は答えを受け入れませんでした。このレイアウトでは

、フォントサイズは寸法が同じであっても、異なっている:

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

はtext_size_smallそこを参照してください?この場合、同じdimenリソースを使用して、フォントサイズがコードよりも小さいのはなぜですか?

+0

この問題を提起いただきありがとうございます。私はまた私のプロジェクトでそれを手に入れます。 – anticafe

答えて

102

の問題。

、使用されています

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

ありがとうございます。ニコラは何を言っているのだろうと思っていますが(私はそれを見ています)、あなたの説明は私に問題の根本を理解させました。 – davidcesarino

2

そのgetDimension方法のドキュメントは、それは私が事前に計算絶対ピクセル値であることを理解Resource dimension value multiplied by the appropriate metric.を返すと述べているので、あなたがsetTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);を使用する必要がありますsppxdpi

tv.setTextSize(14) = 14 pixels 
+0

これは単なる例でした...私はコードでハードコーディングされたユニットを使用しません。私は明確にするために私の質問を更新しました。問題は、レイアウトやコードで取得しているかどうかによって、同じリソースから一貫しないフォントサイズが得られることです。それが私が解決しようとしていた問題です。 – davidcesarino

22

はどういうわけか、これが合うようだ:

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

非常に視覚的にソリューションを説明していただきありがとうございます。一般に、これは本質的にmaxmcが言ったことです...リソースから検索するときにピクセル単位で 'setTextSize'を使うことです。 – davidcesarino

+0

私は 'sp'を使って' textSize'を設定したカスタムコントロールを持っていました。 'getDimensionPixelSize'を使ってその値を取得すると、getはピクセルに変換されます。その後、テキストサイズが設定されると、デフォルトでは 'sp'(またはそのようなもの)に設定され、サイズが大きすぎます。これは多くの助けとなりました。 – JeffRegan

関連する問題