その1 getDemensionさん問題
前提知識
- androidのResources(xxxx.xml)ではstringはもちろん、integerなどが指定できる。
- この中にdimenというものが存在する。
- これはサイズを指定するときに使用するものであり、float型と単位を指定することが出来る。
- 例としてこんなかんじ
<dimen name="sampleSP">10sp</dimen>
- これをLayoutで使用する場合は全く問題ない。
<TextView android:textSize="@dimen/sampleSP"/>
- TextSizeに10spが入るので、直接Layoutに10spを指定する場合とおなじになる。
問題
- dimenで指定したサイズを使って、動的にLayoutを作成しようとした時に問題が起こった。
TextView textView = (TextView) findViewById(R.id.sampleText);
textView.setTextSize(this.getResource.getDimmension(R.dimen.sampleSP));
- 上記のように記述すると、表示されるテキストのサイズがだいぶ大きく表示されてしまった。
- getDimmensionで取得できる値をダンプした結果、2倍の値になっていた。
なぜ?
- getDimmensionで取得できる値はspではなく、pxの値が取得できる。
- また、AndroidManifest.xmlでanyDensityをtrueにしていた場合、端末の解像度に合わせてpxを算出してくれる。
- 使用していた端末がGalaxyNexus(xhdpi)の為、mdpi -> xhdpiは2倍なので、2倍の値が取れていた。
参考
その2 shadowXさん問題
問題
- XMLのdimenを覚えてヒャッハー、dimen便利だぜーと調子ぶっこいていて以下のコードを書きました。
<dimen name="shadowX">3.0dp</dimen>
<TextView android:shadowX="@dimen/shadowX"/>
- 結果は
- Caused by: java.lang.NumberFormatException: Invalid float: "3.0dip"
- 落ちました。
対策
- しょうがないにゃあ・・・
<string name="shadowX">3.0</string>
<TExtView android:shadowX="@string/shadowX" />
その他
- shadowXの指定単位がわからない。公式に単位の記述がないんだよね。
- 一応、dp指定らしいけど。