我们首先应该考虑的是怎样是全体改变,而不是单个改动(虽然这也能做出来,但是太麻烦),我们需要在styles文件下创建字体的大小样式,但在此之前,我们应该创建一个attrs文件:(名字起的有点不规范,见谅~)
<resources>
<attr name="textsize" format="reference|dimension" />
<attr name="textsize2" format="reference|dimension" />
</resources>
然后我们应该在styles文件夹下创建我们的字体大小样式了:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--这里有两个textSize,是因为我这里的控件进行字体放大的时候,不能是同一种尺寸的时候,就可以写多套-->
<style name="Default_TextSize_Small">
<item name="textsize">@dimen/sp_18</item>
<item name="textsize2">@dimen/sp_12</item>
</style>
<style name="Default_TextSize_Middle">
<item name="textsize">@dimen/sp_20</item>
<item name="textsize2">@dimen/sp_14</item>
</style>
<style name="Default_TextSize_Big">
<item name="textsize">@dimen/sp_22</item>
<item name="textsize2">@dimen/sp_16</item>
</style>
接下来就是我们MainActivity中的布局文件了,这里需要注意的是我textView的字体大小:
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.aaaa.Main2Activity">
<Button
android:text="点击跳转"
android:id="@+id/btn_intent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_gravity="center"
android:ellipsize="end"
android:id="@+id/tv_title"
android:text="我是一颗小小的石头,深深的埋在泥土之中···"
android:textColor="#000"
android:textSize="?textsize"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
这里我只用了一个textSize,还有一个textSize2没有用,是因为我不想写第二个不同尺寸的控件~
那么接下来就看MainActivity中的代码了,,如果不懂,可以看完在整理:
public class Main2Activity extends AppCompatActivity {
private Button btn_intent;
private boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
/**
* App.font.getInt("textSize",0)::这是设置字体页面时保存到数据库的值,
* 我们可以根据这个值进行判断当前选择哪套字体,必须在初始化视图之前完成
* 因为设置字体样式是在初始化视图之前操作的,而且只会在app启动时才走
*/
getStates(App.font.getInt("textSize",0));
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//定义一个标识,用来判断App是不是第一次进入的
flag = true;
btn_intent = (Button)findViewById(R.id.btn_intent);
//点击跳转设置页面
btn_intent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Main2Activity.this, ButtonActivity.class);
startActivity(intent);
}
});
}
//用来设置当前页面的字体大小
public void getStates(int states){
//数据库如果没有值,默认是0,所以假如没有选择字体时,就要把字体设置为标准的
if(states==0){
setTheme(R.style.Default_TextSize_Small);
}else
if (1 == states) {
setTheme(R.style.Default_TextSize_Small);
} else if (2 == states) {
setTheme(R.style.Default_TextSize_Middle);
} else {
setTheme(R.style.Default_TextSize_Big);
}
}
//在页面失去焦点时,表面此页面已经切换
@Override
protected void onPause() {
super.onPause();
flag = false;
}
//再次获得焦点时,就可以进行刷新Activity了
@Override
protected void onResume() {
super.onResume();
if(flag==false) {
//这个方法是Activity中自带的,可以用来刷新Activity
recreate();
//在Fragment中使用的话,用这个
//getActivity.recreate();
//在将标识设置成true;
flag = true;
}
}
}
那么,接下来就设置字体的Activity了:
public class ButtonActivity extends BaseThemeActivity implements View.OnClickListener {
Button btnThree;
private Button btn_one;
private Button btn_two;
private Button btn_three;
private TextView tv_title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 这里面其实就放了三个按钮,,,点击事件
*/
setContentView(R.layout.activity_button);
btn_one = (Button)findViewById(R.id.btn_one);
btn_two = (Button)findViewById(R.id.btn_two);
btn_three = (Button)findViewById(R.id.btn_three);
btn_one.setOnClickListener(this);
btn_two.setOnClickListener(this);
btn_three.setOnClickListener(this);
}
@Override
public void onClick(View v) {
/**
* 在点击的时候,将字体的代替值放进SP中,以便以后使用
* 然后销毁页面就行···记得提交
*/
switch (v.getId()){
case R.id.btn_one:
App.edit.putInt("textSize",1);
App.edit.commit();
finish();
break;
case R.id.btn_two:
App.edit.putInt("textSize",2);
App.edit.commit();
finish();
break;
case R.id.btn_three:
App.edit.putInt("textSize",3);
App.edit.commit();
finish();
break;
}
}
}
其次就是这个页面的XML,我觉的不用写的,但是考虑到大多数程序员都不乐意动弹,我就粘上去~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.aaaa.ButtonActivity">
<Button
android:text="标准"
android:id="@+id/btn_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text="较大"
android:id="@+id/btn_two"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text="特大"
android:id="@+id/btn_three"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
那还有就是数据库那个SP了,既然我们调字体大小要在全局里,那么就在Application中做就可以了:
public class App extends Application{
public static SharedPreferences font;
public static SharedPreferences.Editor edit;
@Override
public void onCreate() {
super.onCreate();
//创建数据库 记得在AndroidManifest里面注册一下
font = getSharedPreferences("Font", MODE_PRIVATE);
edit = font.edit();
}
}
好了,因为在真机上演示,我就不放效果图了,大家可以粘一粘,跑一跑,代码不多······