web-dev-qa-db-ja.com

Android:アプリケーション全体のフォントサイズ設定

テキストを表示するすべてのビューで使用されるフォントサイズをアプリケーション全体で設定することはできますか?アプリ内のすべてのテキストをスケーリングできるようにする設定をユーザーに提供したいと思います。

Androidでは、スケーラブルなテキストに "sp"寸法単位 を明示的に使用できますが、「ユーザーのフォントサイズ設定」をグローバルに設定する実際の方法はありません。

アクティビティのインスタンス化に関するすべてのビューを繰り返すことは、実際にはオプションではありません;-)

23
ge0rg

これが私のアプリのために作った方法です。簡単に言うと、Activity.onCreate()で、特定のフォントサイズのセットを使用してスタイルのリソースIDを取得し、このスタイルをアクティビティのテーマに適用します。次に、設定アクティビティを使用して、これらのセットを切り替えることができます。

まず、values/attrs.xmlで、一連のフォントサイズの属性を宣言します。

_<declare-styleable name="FontStyle">
    <attr name="font_small" format="dimension" />
    <attr name="font_medium" format="dimension" />
    <attr name="font_large" format="dimension" />
    <attr name="font_xlarge" format="dimension" />
</declare-styleable>
_

次に、values/styles.xmlで、フォントサイズのいくつかのセットを宣言します。

_<style name="FontStyle">
</style>

<style name="FontStyle.Small">
    <item name="font_small">14sp</item>
    <item name="font_medium">16sp</item>
    <item name="font_large">18sp</item>
    <item name="font_xlarge">20sp</item>
</style>

<style name="FontStyle.Medium">
    <item name="font_small">18sp</item>
    <item name="font_medium">20sp</item>
    <item name="font_large">22sp</item>
    <item name="font_xlarge">24sp</item>
</style>

<style name="FontStyle.Large">
    <item name="font_small">26sp</item>
    <item name="font_medium">28sp</item>
    <item name="font_large">30sp</item>
    <item name="font_xlarge">32sp</item>
</style>
_

次に、すべてのアクティビティのonCreate()メソッドに次を追加します。

_getTheme().applyStyle(new Preferences(this).getFontStyle().getResId(), true);
_

ここで、PreferencesSharedPreferencesオブジェクトへのファサードです。

_public class Preferences {
    private final static String FONT_STYLE = "FONT_STYLE";

    private final Context context;

    public Preferences(Context context) {
        this.context = context;
    }

    protected SharedPreferences open() {
        return context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
    }

    protected Editor edit() {
        return open().edit();
    }

    public FontStyle getFontStyle() {
        return FontStyle.valueOf(open().getString(FONT_STYLE,
            FontStyle.Medium.name()));
    }

    public void setFontStyle(FontStyle style) {
        edit().putString(FONT_STYLE, style.name()).commit();
    }
}
_

fontStyleは次のとおりです。

_public enum FontStyle {
    Small(R.style.FontStyle_Small, "Small"), 
    Medium(R.style.FontStyle_Medium, "Medium"), 
    Large(R.style.FontStyle_Large, "Large");

    private int resId;
    private String title;

    public int getResId() {
        return resId;
    }

    public String getTitle() {
        return title;
    }

    FontStyle(int resId, String title) {
        this.resId = resId;
        this.title = title;
    }
}
_

また、FontStyle.values()は、SpinnerPreferencesActivityのアイテムとして使用されます。それは私のように見えます:

_public class PreferencesActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    getTheme().applyStyle(new Preferences(this).getFontStyle().getResId(), true);
    super.onCreate(savedInstanceState);

    setContentView(R.layout.preferences);

    Preferences prefs = new Preferences(this);

    Spinner fontStylesView = (Spinner) findViewById(R.id.font_styles);
    FontStylesAdapter adapter = new FontStylesAdapter(this,
            R.layout.font_styles_row, FontStyle.values());
    fontStylesView.setAdapter(adapter);

    fontStylesView.setSelection(prefs.getFontStyle().ordinal());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.preferences, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_done:
        onMenuDone();
        finish();
        return true;
    case R.id.menu_cancel:
        finish();
        return true;
    default:
        return false;
    }
}

private void onMenuDone() {
    Preferences prefs = new Preferences(this);

    Spinner fontStylesView = (Spinner) findViewById(R.id.font_styles);
    prefs.setFontStyle((FontStyle) fontStylesView.getSelectedItem());
}
}
_

そして最後に、フォントサイズの設定を使用できます。

_<TextView Android:textSize="?attr/font_large" />
_

または、values /styles.xmlでスタイルを使用することをお勧めします。

_<style name="Label" parent="@Android:style/Widget.TextView">
    <item name="Android:textSize">?attr/font_medium</item>
    <item name="Android:layout_width">wrap_content</item>
    <item name="Android:layout_height">wrap_content</item>
</style>

<style name="Label.XLarge">
    <item name="Android:textSize">?attr/font_xlarge</item>
</style>
_

そして、あなたはそれをこのように使うことができます:

_<TextView style="@style/Label.XLarge" />
_

私の答えがお役に立てば幸いです。

50
mixel

はい、可能です。これを行うには、次のことを行う必要があります。

  1. TextViewを拡張する独自のクラスを宣言します
  2. すべてのダイアログ/アクティビティでそれだけを使用してください

お気に入り:

public class SimpleTextView extends TextView
{
    private static final float DEFAULT_TEXT_SIZE=12.0;
    private static float textSize=DEFAULT_TEXT_SIZE;

    public SimpleTextView(Context context)
    {
        super(context);
        this.setTextSize(textSize);
    }

    public SimpleTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this.setTextSize(textSize);
    }

    public SimpleTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        this.setTextSize(textSize);
    }

    public static void setGlobalSize(float size)
    {
        textSize=size;
    }

    public static float getGlobalSize()
    {
        return textSize;
    }
}

そして今、どこにいても、呼び出すだけですべてのテキストビューですべてのテキストサイズを20にグローバルに変更できます。

SimpleTextView.setGlobalTextSize(20);
5

ここで検討すべきアイデアをヒップから撮影します(カスタムTextViewの実装は必要ありません)

  1. 設定から変更できるが、アプリの呼び出し間は保持されるという考えで、UNIVERSAL_FONT_SIZEのようなプロパティを宣言します
  2. 各アクティビティのonCreateメソッドで、そのプロパティの値を取得し、フィールドとして保存します
  3. テキストサイズ変更可能なコンポーネントごとにそれを使用するようにコードを作成します
  4. BUTTONS_TXT_SIZE、TEXT_SIZE、LIST_TXT_SIZEなどのいくつかのプロパティを作成することを実際に妨げるものはなく、たとえば、テキストの増加率を取得し、コントロールのタイプごとに適切なサイズを計算するロジックがあります(コントロールごとにサイズが異なる場合があるため) )

同じように、これを動的に機能させたいと言いますか?内部リストを保持し、add、remove、setSizeの3つのメソッドを持つ単純なクラス(TextSetterなど)を作成します

  1. Activity#onCreate調整する各コントロールを特定して使用しますTextSetter#setリストに追加します
  2. ユーザーがメニューからフォントサイズを増減したい場合は、それを処理するときに、コントロールのリストをループするTextSetter#setSizeを実行し、それがどのタイプであるかを検出し、それに応じてテキストサイズを調整します。
1
Bostone

@ mixels answerからのカスタム属性でビューを膨らませるのに問題がある人のために。

ビューがフラグメントにある場合は、フラグメントのonCreateView()にもFontStyleを適用するか、アプリケーションのテーマでこれらの属性の値を設定する必要があります。

詳細については、私の質問を参照してください ここ

0
Tomask