透過SharedPreferences管理全部頁面的字體大小

一枝莉莉
8 min readOct 18, 2021

--

Style Theme

#前言

當今天UI和你說:“我就是想要所有海報字體白色陰影在APP上!還要有3個不同字型 普通/大/特大!”
這時,如果請UI直接出圖會容易跑版,那該怎麼辦呢? (謎之音:只能去擋需求了)

只能說神人藏在民間/網路上的鄉民。神人左思右想,最後想到個妙招解法:透過SharedPreferences管理全部頁面的字體大小。看是邪魔歪道,實則作法正統 令人驚艷,不禁拍手喊道:“長知識啦~”!

題外話,大神的GitHub可以follow看看:

到底是什麼神奇妙招?!讓我們開始吧~

#如何透過SharedPreferences管理全部頁面的字體大小?

Step1. 先在attr宣告ㄧ個變數

宣告變數於attrs

這裡取名”_20"表示原本大小為20sp的字,路徑:Res/values/attrs.xml

<resources>
<declare-styleable name="FontSize">
<attr name="_14" format="dimension"/>
<attr name="_16" format="dimension"/>
<attr name="_18" format="dimension"/>
<attr name="_20" format="dimension"/>
<attr name="_24" format="dimension"/>
<attr name="_28" format="dimension"/>
<attr name="_32" format="dimension"/>
<attr name="_56" format="dimension"/>
</declare-styleable>
</resources>

Step2. Style設定3個themes給定不同大小

Style設定不同themes的字型大小

styles.xml給定3 themes 普通 Normal /大 Big /特大字型 Very Big

<resources xmlns:tools="http://schemas.android.com/tools">
<style name="FontSize.Normal" parent="Theme.APPName">
<item name="_14">14sp</item>
<item name="_16">16sp</item>
<item name="_18">18sp</item>
<item name="_20">20sp</item>
<item name="_24">24sp</item>
<item name="_28">28sp</item>
<item name="_32">32sp</item>
<item name="_56">56sp</item>
</style>
<style name="FontSize.Big" parent="Theme.APPName">
<item name="_14">16sp</item>
<item name="_16">18sp</item>
<item name="_18">20sp</item>
<item name="_20">22sp</item>
<item name="_24">26sp</item>
<item name="_28">30sp</item>
<item name="_32">34sp</item>
<item name="_56">58sp</item>
</style>
<style name="FontSize.VeryBig" parent="Theme.APPName">
<item name="_14">18sp</item>
<item name="_16">20sp</item>
<item name="_18">22sp</item>
<item name="_20">24sp</item>
<item name="_24">28sp</item>
<item name="_28">32sp</item>
<item name="_32">36sp</item>
<item name="_56">60sp</item>
</style>
</resources>

Step3. 接著xml可以直接取"?_20"這個變數

xml可以直接取textSize ”?_20”這個變數

將textSize帶入"?_20"

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-"
android:textSize="?_20" />

Step4. 最後把每ㄧ頁的20sp都變成"?_20"就可以了

Function 給定字型大小 setTheme

可以寫個 Function 給定字型大小的 Theme
範例寫於BaseActivity ,Function: setFontSize()

public void setFontSize(){
String font_size = Pref.getStringValue(this, Constant.PREF_FONT_SIZE,"normal");
switch (font_size){
case "big":
setTheme(R.style.FontSize_Big);
break;
case "very_big":
setTheme(R.style.FontSize_VeryBig);
break;
default:
setTheme(R.style.FontSize_Normal);
break;
}
}

範例 BaseActivityonCreate() 加上setFontSize();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setFontSize();
}

完整範例:

public class BaseActivity extends AppCompatActivity {@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//hide title bar
Objects.requireNonNull(getSupportActionBar()).hide();
setFontSize();
}
public void setFontSize(){
String font_size = Pref.getStringValue(this, Constant.PREF_FONT_SIZE,"normal");
switch (font_size){
case "big":
setTheme(R.style.FontSize_Big);
break;
case "very_big":
setTheme(R.style.FontSize_VeryBig);
break;
default:
setTheme(R.style.FontSize_Normal);
break;
}
}
}

#Next Steps?

如果這篇文章對你有幫助,可以幫忙分享給更多人知道,也可在下方留言。

另外如果你喜歡~可以ㄧ起來為這篇文拍個10下手 : ) 你的喜歡會是我們寫作的動力。

--

--

一枝莉莉
一枝莉莉

Written by 一枝莉莉

Product Manager | 喜歡發現生活中的樂趣 | 左撇子 | 平時熱衷於觀察社會及研究 UI /UX 設計 | 愛上旅行 / 做甜點 / 影樂欣賞 / 瑜珈。

No responses yet