您的位置:首页 > 其它

一步一步教你实现主题切换功能

2016-09-28 11:37 253 查看
现在市面上好多App都支持主题切换功能,所谓主题切换就是当从一种主题切换到另一种主题时,并不只是单单的修改了一下背景颜色,而是将整个App的背景、字体样式、图标等都进行了一系列的修改,并且风格应该统一。

具体实现主题切换功能的方式有很多, 今天我来介绍一种热插拔实现主题切换的方式。 首先来了解一下什么叫热插拔。

所谓热插拔就是当用户想要的时候就直接安装主题Apk, 如果感觉某一套主题不太好看,或者系统硬盘比较吃紧,用户只要将主题Apk卸载掉就OK了

Okay! 废话不多说,先整理一下实现热插拔主题切换的思路

制作几套主题Apk

创建主题切换的Apk,并添加实现代码

打完收工~~ WTF!! 前面铺垫了那么多,实现思路就这么两部??? 你没有看错,就需要这两部即可(我们不要998,也不要98, 只要38,男友领回家)

制作主题Apk

如下图所示,我创建了两个工程,分别叫BlackTheme和WhiteTheme





在这两个主题Apk中没有任何Activity,也没有任何布局文件,因为不需要,主题Apk只需要提供相应的主题资源(图片,颜色,字体样式等)即可。我在每一套主题Apk中都放置了4张用来表示系统的图标,分别如下:

















创建主题切换的Apk,并添加实现代码

接下来创建实现主题切换的Apk,创建工程结构如下所示:



在主应用中也有4张表示系统的图标, 默认图标如下:









接下来修改主界面布局xml文件, 代码如下

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="material.danny_jiang.com.switchthemedemo.MainActivity">

<Button
android:id="@+id/whiteBtn"
android:text="switch to white theme"
android:textSize="18sp"
android:onClick="switchWhiteTheme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>

<Button
android:id="@+id/defalultBtn"
android:text="switch to default theme"
android:textSize="18sp"
android:onClick="switchDefautTheme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/whiteBtn"
android:layout_alignLeft="@id/whiteBtn"/>

<Button
android:id="@+id/blackBtn"
android:text="switch to black theme"
android:textSize="18sp"
android:onClick="switchBlackTheme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/whiteBtn"
android:layout_alignLeft="@id/whiteBtn"/>

<ImageView
android:id="@+id/image_Android"
android:src="@drawable/theme_android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
/>

<ImageView
android:id="@+id/image_Apple"
android:src="@drawable/theme_apple"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
/>

<ImageView
android:id="@+id/image_Linux"
android:src="@drawable/theme_linux"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
/>

<ImageView
android:id="@+id/image_Windows"
android:src="@drawable/theme_windows"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
/>
</RelativeLayout>


显示效果如下:



然后,在MainActivity中实现切换主题的核心代码。

思路就是通过Context.createPackageContext(String packageName)可以获取相应包名App的上下文对象,有了此上下文对象就可以访问此包名App中的各种资源(图片,颜色值等等)

注意:每一个主题Apk中的图片名称应该一致!!!!

MainActivity中的代码如下:

package material.danny_jiang.com.switchthemedemo;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

private ImageView imageAndroid;
private ImageView imageApple;
private ImageView imageLinux;
private ImageView imageWindows;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

imageAndroid = ((ImageView) findViewById(R.id.image_Android));
imageApple = ((ImageView) findViewById(R.id.image_Apple));
imageLinux = ((ImageView) findViewById(R.id.image_Linux));
imageWindows = ((ImageView) findViewById(R.id.image_Windows));

String packageName = getSavedPackageName();

switchThemeBaseOnContext(packageName);
}

private void switchThemeBaseOnContext(String packageName) {

Context newContext = null;

try {
newContext = createPackageContext(packageName, CONTEXT_IGNORE_SECURITY);

int theme_android_id = newContext.getResources().getIdentifier(
"theme_android", "drawable", newContext.getPackageName());
Drawable drawableAndroid = newContext.getResources().getDrawable(theme_android_id);
imageAndroid.setImageDrawable(drawableAndroid);

int theme_apple_id = newContext.getResources().getIdentifier(
"theme_apple", "drawable", newContext.getPackageName());
Drawable drawableApple = newContext.getResources().getDrawable(theme_apple_id);
imageApple.setImageDrawable(drawableApple);

int theme_linux_id = newContext.getResources().getIdentifier(
"theme_linux", "drawable", newContext.getPackageName());
Drawable drawableLinux = newContext.getResources().getDrawable(theme_linux_id);
imageLinux.setImageDrawable(drawableLinux);

int theme_windows_id = newContext.getResources().getIdentifier(
"theme_windows", "drawable", newContext.getPackageName());
Drawable drawableWindows = newContext.getResources().getDrawable(theme_windows_id);
imageWindows.setImageDrawable(drawableWindows);

saveThemeInSharedPreferences(newContext.getPackageName());
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}

private String getSavedPackageName() {
SharedPreferences sp = getSharedPreferences("theme_pref", MODE_PRIVATE);

String packageName = sp.getString("theme", getPackageName());

return packageName;
}

private void saveThemeInSharedPreferences(String packageName) {
SharedPreferences sp = getSharedPreferences("theme_pref", MODE_PRIVATE);

SharedPreferences.Editor editor = sp.edit();

editor.putString("theme", packageName);

editor.commit();
}

public void switchWhiteTheme(View view) {
switchThemeBaseOnContext("material.danny_jiang.com.whitetheme");
}

public void switchBlackTheme(View view) {
switchThemeBaseOnContext("material.danny_jiang.com.blacktheme");
}

public void switchDefautTheme(View view) {
switchThemeBaseOnContext(getPackageName());
}

}


运行效果如下:



Demo下载地址 : http://download.csdn.net/detail/zxm317122667/9641979
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: