Android:应用程序范围的字体大小首选项

是否可以在所有视图显示文本中使用字体大小进行应用程序范围的设置? 我想提供一个偏好的用户应该允许缩放应用程序中的所有文字。

Android明确允许使用“sp”维度单位来进行可缩放的文本,但是没有实际的方法来以全局方式设置“用户的字体大小偏好”。

遍历活动实例化的所有视图并不是真正的select;-)

Related of "Android:应用程序范围的字体大小首选项"

这是我为我的应用程序做的。 简而言之 – 在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()在您的PreferencesActivity用作Spinner项目。 这就是我的样子:

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

我希望我的回答能帮助你。

是的,这是可能的。 要做到这一点,你需要:

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

从臀部射击这里的想法来考虑(不需要自定义的TextView实现)

  1. 声明属性类似UNIVERSAL_FONT_SIZE的想法,它可以从设置更改,但将保留在应用程序调用之间
  2. 在您的每个活动的onCreate方法获取该属性的值并保存为一个字段
  3. 让您的代码使用每个文本可resize的组件
  4. 没有什么会实际上阻止你创build诸如BUTTONS_TXT_SIZE,TEXT_SIZE,LIST_TXT_SIZE等几个属性,然后有逻辑,例如文本增加的百分比,并为每种types的控件计算适当的大小(因为对于不同的控件可能有不同的大小)

沿着相同的路线,说你想使这个dynamic工作? 创build一个简单的类(比如TextSetter),它包含内部列表,并且有3个方法:add,remove和setSize

  1. Activity#onCreate确定要调整的每个控件,并使用TextSetter#set将其添加到列表中
  2. 当用户想要从菜单中增加/减less字体大小时,当你处理刚刚执行的TextSetter#setSize,你将在其中循环控制列表,检测它是哪一种types并相应地调整文本大小

对于那些用@mixels自定义属性来填充视图的问题的答案。

如果视图是分段的,则需要在片段的onCreateView()应用FontStyle,或者在应用程序的主题中设置这些属性的值。

更多详细信息,请看我在这里 。