テキストを表示するすべてのビューで使用されるフォントサイズをアプリケーション全体で設定することはできますか?アプリ内のすべてのテキストをスケーリングできるようにする設定をユーザーに提供したいと思います。
Androidでは、スケーラブルなテキストに "sp"寸法単位 を明示的に使用できますが、「ユーザーのフォントサイズ設定」をグローバルに設定する実際の方法はありません。
アクティビティのインスタンス化に関するすべてのビューを繰り返すことは、実際にはオプションではありません;-)
これが私のアプリのために作った方法です。簡単に言うと、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);
_
ここで、Preferences
はSharedPreferences
オブジェクトへのファサードです。
_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()
は、Spinner
のPreferencesActivity
のアイテムとして使用されます。それは私のように見えます:
_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" />
_
私の答えがお役に立てば幸いです。
はい、可能です。これを行うには、次のことを行う必要があります。
TextView
を拡張する独自のクラスを宣言しますお気に入り:
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);
ここで検討すべきアイデアをヒップから撮影します(カスタムTextViewの実装は必要ありません)
onCreate
メソッドで、そのプロパティの値を取得し、フィールドとして保存します同じように、これを動的に機能させたいと言いますか?内部リストを保持し、add、remove、setSizeの3つのメソッドを持つ単純なクラス(TextSetterなど)を作成します
Activity#onCreate
調整する各コントロールを特定して使用しますTextSetter#set
リストに追加します