読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

Android4.0でフォントサイズが変わるのを何とかする

Android

Android4.0(Ice Cream Sandwich)から設定でフォントサイズがユーザー側で変更できるようになっています。
f:id:STAR_ZERO:20111021224100p:image


spでフォントサイズを指定した箇所はコノ設定に従ってサイズが変わってしまいます。
コレを何とかしたいと思います。
とりあえず見つけた方法なので、もっと簡単な方法があれば教えて下さい。


サンプルで次のようなレイアウトを使います。
text1という上のTextViewだけに処理を入れます。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/text1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="hogehoge"
        android:textSize="16sp" />
    <TextView
        android:id="@+id/text2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="hogehoge"
        android:textSize="16sp" />
</LinearLayout>

で、ロジックの方で次のようにします。

import android.app.Activity;
import android.os.Bundle;
import android.provider.Settings;
import android.util.TypedValue;
import android.widget.TextView;

public class SampleTextSizeActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView text1 = (TextView) findViewById(R.id.text1);
        float scale = Settings.System.getFloat(getContentResolver(), Settings.System.FONT_SCALE, 1);
        float size = text1.getTextSize() / scale;
        text1.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
    }
}

FONT_SCALEの値を取って、それを指定しているサイズに対して計算してからサイズを再設定している感じです。
これだけで一応対応はできるっぽいです。


確認でキャプチャを取っておきます。


Normal
f:id:STAR_ZERO:20111021225054p:image


Small
f:id:STAR_ZERO:20111021225055p:image


Extra large
f:id:STAR_ZERO:20111021225056p:image


下のTextViewは設定で変わってますが、上のTextViewの大きさは変わってません。


↓にプロジェクトごと置いておきます
STAR-ZERO/SampleTextSize-IceCreamSandwich · GitHub

追記

コメント頂いて実際に試したところ、単位をdpにすると設定の影響を受けないようです。
もし、新規でプロジェクト作る+設定を無視したい場合はdpで指定すると良いと思います。