android使用setTheme的方式实现主题切换

theme的意思即风格,在android中你可以理解成是一整套属性的集合,设置了theme可以看做为为APP的一些全局的变量赋值,然后之后的界面显示会使用这些值来显示出相应的效果。
设置theme方式实现主题切换的详细步骤在这篇文章已经有详细描述,我就不再赘述了,这里介绍一下设置theme方式实现主题切换的一些实现细节。

上边那个博文中也提到了,设置theme要在设置activity的显示内容之前。网上有人说是可以调用recreate方法重启activity,但是重启的时候有闪动并且当前的状态也不太好保存,所以并不是好的解决方法。

设置theme的整体思路是正确的,当前的theme标记要保存在本地,每个activity启动的时候在setContentView之前取出该标记并调用setTheme方法设置theme即可。而主题切换的功能其实是改变了这个保存的标记,但是为了让用户能意识到主题已经切换了,在主题切换所在的activity就需要立即应用到这个已经变化了的主题。这里有两种方式:一种是暴力方式,即按照切换后的主题方案分别设置当前界面所有可见元素的属性,因为设置主题的界面通常只有一个所以一次设置之后不会有过多的这种繁琐的操作;另外一种是使用fragment,fragment也可以设置theme,代码如下:

@Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        final Context contextThemeWrapper = new ContextThemeWrapper(
                getActivity(), isDay ? R.style.day : R.style.night);
        LayoutInflater localInflater = inflater
                .cloneInContext(contextThemeWrapper);
        View v = localInflater.inflate(R.layout.fragment_layout, container,
                false);
        return v;
    }

如果你的主题切换设置界面是写在fragment里边,只需要在改变了theme之后重新加载这个fragment就行了。
下边是一个例子效果:

另附一个demo下载地址

你可能感兴趣的:(Android项目知识积累)