android 动态加载主题,ZTheme: ZTheme是一款小巧的Android插件化切换皮肤主题框架,动态去加载APK,对基于MVP或MVC分层设计的View层进行替换,实现切换主题皮肤的功能。...

ZTheme是一款小巧的Android换肤框架,实现原理是动态加载APK,对基于MVP或MVC分层设计的View层进行替换,实现切换主题皮肤的功能。

同时兼容 ART 和 Dalvik虚拟机。

cd87350952f3a5a1620e0e47941405ee.gif

ZTheme 使用示例

创建ZTheme方法声明

ZTheme createTheme(String apkPath, Context context);

ZTheme createTheme(String apkPath, String libraryPath, Context context)

使用apk创建ZTheme对象

mZTheme = ZTheme.createTheme("/sdcard/theme/theme_dark.apk", this);

3.创建 ZThemeView 方法声明

//根据反射创建ZThemeView对象,此处传入类名

IThemeView getThemeView(String className)

4.创建 ZThemeView 对象

IThemeView.getThemeView("com.rxx.ztheme.dark.view.LoginView");

5.最后就可以获取到一个view,加载到Activity。

setContentView(IThemeView.getView());

Demo代码示例,一个基于MVC模式的简单实现。

Controller 层定义 :ILoginController

public abstract class ILoginController extends BaseActivity {

/**

* 登录

*/

public abstract void doLogin();

/**

* 处理切换主题

*/

public abstract void doChangeTheme();

@Override

public String getViewTag() {

return PhoneMateViewRelated.TAG_LOGIN;

}

}

Controller 实现 : LoginActivity

public class LoginActivity extends ILoginController {

private int themeIndex = 0;

@Override

protected void zOnCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

@Override

public void doLogin() {

Toast.makeText(this, "doLogin,name:"+mView.getAccountName()+",password:"+mView.getPassword(), Toast.LENGTH_SHORT).show();

}

@Override

public void doChangeTheme() {

if ((themeIndex % 2) == 0) {

zGetApplication().changeTheme(((PhoneMateApplication) zGetApplication()).getLight(), null);

} else {

zGetApplication().changeTheme(((PhoneMateApplication) zGetApplication()).getDark(), null);

}

themeIndex++;

}

}

3.View层定义: ILoginView

public abstract class ILoginView extends BaseView{

public ILoginView(Context context, ZTheme iTheme) {

super(context, iTheme);

}

public abstract String getAccountName();

public abstract String getPassword();

public abstract void showLogin();

public abstract void showInput();

}

4.View层实现 :

Dark主题

public class LoginView extends ILoginView implements View.OnClickListener {

private LinearLayout mLayoutAccount;

private ProgressBar mLoginProgressBar;

private EditText mEditTextAccount;

private EditText mEditTextPassword;

private Button mButtonLogin;

private Button mButtonChange;

public LoginView(Context context, ZTheme zTheme) {

super(context, zTheme);

setContentView(R.layout.activity_login);

mLayoutAccount = (LinearLayout) findViewById(R.id.mLayoutAccount);

mLoginProgressBar = (ProgressBar) findViewById(R.id.mLoginProgressBar);

mEditTextAccount = (EditText) findViewById(R.id.mEditTextAccount);

mEditTextPassword = (EditText) findViewById(R.id.mEditTextPassword);

mButtonLogin = (Button) findViewById(R.id.mButtonLogin);

mButtonChange = (Button) findViewById(R.id.mButtonChange);

mButtonLogin.setOnClickListener(this);

mButtonChange.setOnClickListener(this);

}

@Override

public String getAccountName() {

return mEditTextAccount.getText().toString();

}

@Override

public String getPassword() {

return mEditTextPassword.getText().toString();

}

@Override

public void showLogin() {

mLoginProgressBar.setVisibility(View.VISIBLE);

mLayoutAccount.setVisibility(View.GONE);

}

@Override

public void showInput() {

mLoginProgressBar.setVisibility(View.GONE);

mLayoutAccount.setVisibility(View.VISIBLE);

}

@Override

public ViewType getViewType() {

return ViewType.VIEW_PLUG;

}

@Override

public void onClick(View view) {

if (view == mButtonLogin && mController != null && !mController.isDestroyed()) {

mController.doLogin();

} else if (view == mButtonChange && mController != null && !mController.isDestroyed()) {

mController.doChangeTheme();

}

}

}

light 主题

public class LoginView extends ILoginView implements View.OnClickListener {

private LinearLayout mLayoutAccount;

private ProgressBar mLoginProgressBar;

private EditText mEditTextAccount;

private EditText mEditTextPassword;

private Button mButtonLogin;

private Button mButtonChange;

public LoginView(Context context, ZTheme zTheme) {

super(context, zTheme);

setContentView(R.layout.activity_login);

mLayoutAccount = (LinearLayout) findViewById(R.id.mLayoutAccount);

mLoginProgressBar = (ProgressBar) findViewById(R.id.mLoginProgressBar);

mEditTextAccount = (EditText) findViewById(R.id.mEditTextAccount);

mEditTextPassword = (EditText) findViewById(R.id.mEditTextPassword);

mButtonLogin = (Button) findViewById(R.id.mButtonLogin);

mButtonChange = (Button) findViewById(R.id.mButtonChange);

mButtonLogin.setOnClickListener(this);

mButtonChange.setOnClickListener(this);

}

@Override

public String getAccountName() {

return mEditTextAccount.getText().toString();

}

@Override

public String getPassword() {

return mEditTextPassword.getText().toString();

}

@Override

public void showLogin() {

mLoginProgressBar.setVisibility(View.VISIBLE);

mLayoutAccount.setVisibility(View.GONE);

}

@Override

public void showInput() {

mLoginProgressBar.setVisibility(View.GONE);

mLayoutAccount.setVisibility(View.VISIBLE);

}

@Override

public ViewType getViewType() {

return ViewType.VIEW_PLUG;

}

@Override

public void onClick(View view) {

if (view == mButtonLogin && mController != null && !mController.isDestroyed()) {

mController.doLogin();

} else if (view == mButtonChange && mController != null && !mController.isDestroyed()) {

mController.doChangeTheme();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值