`
yangzc106
  • 浏览: 157118 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

换肤实现思路(二)

 
阅读更多

以前写过一个关于皮肤的换肤思路的博客。但那个里边主要是针对于资源换肤,没有布局换肤的概念。今天实现了一个可以更换布局的换肤实现。

 

思路还是上篇文章的思路,只是做了一个简单的实现。

 

代码如下:

package com.test.android.skin.main;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView((View)getResource("main", "layout"));
		Button btn = (Button) findViewById(R.id.btn);
		btn.setBackgroundDrawable((Drawable) getResource("btn_background", "drawable"));
		
		SqLHelper helper = new SqLHelper(this);
		SQLiteDatabase db = helper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("id", "3");
		values.put("packname", "org.yangzc.package3");
		db.insert("skinTab", null, values);
		db.close();
		
		db = helper.getWritableDatabase();
		Cursor c = db.rawQuery("select * from skinTab", null);
        while(c.moveToNext()){
        	String id = c.getString(c.getColumnIndex("id"));
        	String packname = c.getString(c.getColumnIndex("packname"));
        	Log.d("Tag", "Id:"+id + "   packname:" + packname);
        }
	}
	
	private Object getResource(String filename, String defType){
		Context myContext = null;
		try {
			myContext = this.createPackageContext(
					"com.test.android.skin.myskin",
					Context.CONTEXT_IGNORE_SECURITY);
			int id = myContext.getResources().getIdentifier(filename, defType, myContext.getPackageName());
			if("drawable".equals(defType)){
				return myContext.getResources().getDrawable(id);
			}else if("layout".equals(defType)){
				LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(LAYOUT_INFLATER_SERVICE);
				return inflater.inflate(id, null);
			}
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
	}
}

 

 

方向一:

这几天看了一下源码,主要是关于Context的东西。理想化的情况是,进入activity之后首先改一下context,这样之后框架就会动态实现换肤功能。追到了ContextThemeWrapper类,本来看到了attachBaseContext方法,以为OK了呢。看到一下代码郁闷了。继续看...

protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }

 

 

 

 

 

分享到:
评论
1 楼 bluky999 2011-08-19  
看了LZ的博客, 是在做XMPP相关的项目吧? 服务器和android app客户端?  莫非也是IM ?语音短信?米聊?

相关推荐

    Android实现换肤的两种思路分析

    这里来了解换肤实现及不同方案的差异和使用场合。 一、从功能上划分 1) 软件内置多个皮肤,用户不能修改; 2) 官方提供皮肤下载,用户使用下载的皮肤; 3) 官方提供皮肤制作工具或方法,用户自制皮肤。 二、皮肤定义...

    dot net下实现winform窗体换肤

    本文将深入探讨如何在.NET环境下,利用C#或VB.NET等语言实现WinForm窗体的换肤功能,让您的应用程序看起来更加现代、吸引人。 首先,了解WinForm窗体换肤的基本原理。WinForm窗体的外观主要由控件的样式和主题决定...

    MIUI主题风格_一种Android系统换肤功能的设计 思路(董红光)

    ### MIUI主题风格——一种Android系统换肤功能的设计思路 #### 一、引言 随着移动设备的普及和发展,用户体验成为软件开发中的一个重要考量因素。其中,个性化设置,特别是主题风格的定制化服务,越来越受到用户的...

    Android应用开发中实现apk皮肤文件换肤的思路分析

    在Android应用开发中,实现apk皮肤文件换肤是一项常见的需求,它可以提高用户的个性化体验,同时降低主程序的维护复杂度。以下是对实现这一功能的详细分析: 首先,我们需要理解Android系统的安全机制。每个APK在...

    mfc界面换肤

    换肤的基本思路是:创建一套皮肤资源,如位图或PNG图片,用于表示不同控件在不同状态下的外观;然后,在控件绘制时,根据配置文件选择对应的皮肤资源进行绘制。以下是一些关键步骤: 1. **设计皮肤资源**:通常,...

    WPF结合DEV换肤

    在本文中,我们将深入探讨如何在Windows Presentation Foundation (WPF) 应用程序中结合DevExpress (DEV) 控件实现自定义皮肤换肤功能。WPF是.NET Framework的一部分,提供了丰富的用户界面开发工具,而DevExpress则...

    react实现换肤功能的示例代码

    三、具体实现思路 1. 在React组件中,我们可以这样创建主题色选择的HTML部分: ```jsx ${this.state.skinIndex==0?'active':''}`} onClick={this.toggleSkin.bind(this,0)}> ${this.state.skinIndex==1?'active'...

    网站换肤

    为了实现网站换肤,开发者需要理解前端渲染原理,熟悉CSS层叠和作用域,以及如何通过JavaScript操作DOM。此外,考虑到性能和兼容性,优化资源加载和处理用户选择的速度也至关重要。最后,良好的文档和测试可以帮助...

    易语言其它简易换肤13种

    在这个压缩包中,"其它简易换肤13种"可能表示有13个不同的换肤实现,每个实现都可能采用了不同的方法或策略。这为学习者提供了多角度了解和实践皮肤更换技术的机会。 易语言的换肤功能实现可能涉及到以下几个知识点...

    安卓换肤主题更换夜间模式相关-Android手指滑动切换页面换皮肤.rar

    总之,这个压缩包提供了关于Android应用中手指滑动切换页面和主题换肤的实现思路,包括触摸事件处理、主题资源管理和夜间模式切换。通过学习和理解这些代码,开发者可以提升自己的Android开发技能,为用户打造更友好...

    微信小程序换肤功能实现代码(思路详解)

    首先,我们要理解实现换肤功能的核心思路: 1. **准备皮肤相关的wxss**:创建不同主题的样式表,比如深黑、粉红、橘黄等,将这些样式表引入到`app.wxss`,这样每个页面都可以使用。 2. **动态更改元素的类名或id**...

    C#实现窗体换肤完整源码_(0610).rar.rar

    6. **组件化设计**:为了保持代码的可维护性和复用性,窗体换肤的实现通常会采用组件化的设计思路,将皮肤应用逻辑封装在一个独立的类库中,这样其他项目也可以轻松地引用和使用。 7. **性能优化**:由于窗体换肤...

    Vue + Scss 动态切换主题颜色实现换肤的示例代码

    动态切换主题颜色的实现思路 实现动态切换主题颜色,关键在于在项目中合理运用CSS变量。步骤如下: - **为html根元素设置data-theme属性**:这个属性值根据用户选择的主题动态改变。 - **通过Scss变量使用对应...

    webpack构建换肤功能的思路详解

    总结起来,Webpack构建换肤功能的核心思路包括: 1. 设置多个入口点,每个入口点对应一个皮肤主题。 2. 使用CSS预处理器(如Stylus)定义皮肤变量并导入共享样式。 3. 打包后处理HTML,移除多余JS引用,将皮肤CSS...

    安卓换肤主题更换夜间模式相关-Android夜间模式实现通过在window上加一层半透明的View.rar

    以上就是通过在window上加一层半透明的View来实现Android夜间模式的基本思路。实际开发中,开发者还可以结合SharedPreferences存储用户的夜间模式偏好,以及使用Android的AppCompat库的DarkTheme主题来全局实现夜间...

    使用vue + less 实现简单换肤功能的示例

    首先,先说一下我最初的思路。 我最初的想法是使用less定义变量,然后通过js来切换变量,通过切换的变量来达到换肤的效果。 我先新建了一个 theme.less文件,代码如下: @theme:@themea; @themea:pink; @themeb:...

    jQuery无刷新换肤:实时切换四种网页背景代码.rar

    jQuery无刷新换肤,实时切换四种网页背景代码,...本实例为想实现无刷新换肤的朋友提供一种思路,因此CSS文件写的比较简单,仅更换了背景色,不过再复杂的换肤,其原理同样是基于此。希望通过本特效让你实现网页换肤。

Global site tag (gtag.js) - Google Analytics