App内部改变字体大小并即时刷新

我们首先应该考虑的是怎样是全体改变,而不是单个改动(虽然这也能做出来,但是太麻烦),我们需要在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();
    }
}

好了,因为在真机上演示,我就不放效果图了,大家可以粘一粘,跑一跑,代码不多······



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值