`
bkship
  • 浏览: 47880 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android程序换皮肤之二

阅读更多

 

通过网上流传的sharedUserId实现 不同程序间的资源共享

 

 

这种就是皮肤分离,皮肤是个单独的apk单独从网上下下来安装后,供主程序调用资源

 

 

大家可以参考下雨辰专栏写的一篇文章:

 

 

http://blog.csdn.net/suiyc/archive/2011/04/17/6329212.aspx

 

 

QQ,墨迹天气,搜狗输入法貌似都是这种方式实现的

 

 

在主程序,皮肤程序的manifest中都添加同一个sharedUserId,这个应该是随便你写,只要共享工程的一样

 

 

android:sharedUserId=com.bkship

 

 

 

皮肤工程比较简单创建一个后就是在manifest中添加sharedUserId 然后在drawable中放进你的图片就可以

 

 

 

主程序里面通过下面方法来调用皮肤工程

 

 

 

 

Context ctx = MySkin.this.createPackageContext(

 

 

 

           “com.bkship.skin1”,Context.CONTEXT_IGNORE_SECURITY); 

 

 

 

 

button1.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.button1));

 

 

 

 

此处的com.bkship.skin1为你皮肤工程的包名。

 

 

 

而且这里要注意的就是你要替换的资源的名字 必须跟 主程序里面的资源名字一致

 

 

 

这可能也是为什么QQ,墨迹天气,搜狗输入法 自身只带一套皮肤的原因。

 

 

 

因为主程序带多套皮肤的话,必然是不同的名字,那皮肤工程没法去跟替换的资源同名,因为你替换时候

 

 

 

当前不定是哪个资源呢,当然这也仅仅是我自己的理解啦。

 

 

 

布局跟我上一篇的一样

 

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<LinearLayout

android:id = "@+id/linearlayout1"

android:layout_width = "fill_parent"

android:layout_height = "wrap_content"

android:layout_alignParentTop = "true">

<Button

android:id = "@+id/button1"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:background = "@drawable/button1"/>

<Button

android:id = "@+id/button2"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:background = "@drawable/button2"/>

<Button

android:id = "@+id/button3"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:background = "@drawable/button3"/>

<Button

android:id = "@+id/button4"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:background = "@drawable/button4"/>

</LinearLayout>

 

<LinearLayout

android:id = "@+id/linearlayout2"

android:layout_width = "fill_parent"

android:layout_height = "wrap_content"

android:layout_alignParentBottom = "true">

<Button

android:id = "@+id/button5"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:background = "@drawable/button5"/>

<Button

android:id = "@+id/button6"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:background = "@drawable/button6"/>

<Button

android:id = "@+id/button7"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:background = "@drawable/button7"/>

<Button

android:id = "@+id/button8"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:background = "@drawable/button8"/>

</LinearLayout>

<ImageView

android:id = "@+id/image"

android:layout_width = "fill_parent"

android:layout_height = "wrap_content"

android:layout_below = "@id/linearlayout1"

android:layout_above = "@id/linearlayout2"

android:background = "@drawable/bg"/>

 

</RelativeLayout>

 

 

 

 

 

下面是主体程序 :

 

 

 

 

package com.bkship.myskin;

 

import android.app.Activity;

import android.content.Context;

import android.content.pm.PackageManager.NameNotFoundException;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ImageView;

 

public class MySkin extends Activity {

    /** Called when the activity is first created. */

 

    private Button button1;

    private Button button2;

    private Button button3;

    private Button button4;

    private Button button5;

    private Button button6;

    private Button button7;

    private Button button8;

    private ImageView image;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

 

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

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

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

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

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

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

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

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

image = (ImageView)findViewById(R.id.image);

button5.setOnClickListener(onClick);

button6.setOnClickListener(onClick);

button7.setOnClickListener(onClick);

button8.setOnClickListener(onClick);

 

    }

 

OnClickListener onClick = new OnClickListener(){

 

@Override

public void onClick(View v) {

Context ctx = null;

int id = v.getId();

String skinPackage = null;

switch (id ) {

case R.id.button5:

skinPackage = "com.bkship.myskin";

break;

case R.id.button6:

skinPackage = "com.bkship.myskin1";

break;

case R.id.button7:

skinPackage = "com.bkship.myskin2";

break;

case R.id.button8:

skinPackage = "com.bkship.myskin3";

break;

default:

break;

}

 

try {

ctx = MySkin.this.createPackageContext(

skinPackage,

Context.CONTEXT_IGNORE_SECURITY);

Log.e("", "ctx");

} catch (NameNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

Log.e("", "ctx is null");

}

button1.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.button1));

button2.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.button2));

button3.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.button3));

button4.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.button4));

button5.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.button5));

button6.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.button6));

button7.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.button7));

button8.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.button8));

image.setBackgroundDrawable(ctx.getResources().getDrawable(

R.drawable.bg));

}

};

}

 

 

 

 

将主程序跟三个皮肤程序 打包奉上!

 

 

对了 要运行看效果的话 得将皮肤包三个先在机子上跑一下。

 

 

要主程序调用皮肤工程 得皮肤工程安装了才行

 

 

同时这种情况会导致安装了好多皮肤后你的程序列表里面会多好多皮肤程序,

 

 

可以通过下面的代码将其隐藏,只能在管理应用程序那里能看到

 

 

在要隐藏的皮肤工程的manifest里面的intentfilter中去掉这句

 

 

<category android:name="android.intent.category.LAUNCHER"></category>

 

 

这句话就是说 让我们的应用程序在launcher里启动起来,

 

 

不写它就是不让在那里启动,当然也就看不到我们的应用程序的图标了。

 

 

 

关于在launcher中不显示,这块,借鉴于cat_fang blog 

 

 

http://archive.cnblogs.com/a/2068309/

 

 

分享到:
评论
1 楼 zhouming4455 2012-02-29  
IT'S WHAT CODE

相关推荐

    android程序换皮肤之一

    本文将探讨如何实现Android程序的换肤功能,主要关注于"android程序换肤之一"这个主题。博客链接(由于此处无法直接访问,我们将基于常见实践进行解释)可能提供更深入的技术细节和示例代码。 1. **皮肤概念**: -...

    android仿QQ更换皮肤

    在Android平台上,模仿QQ更换皮肤是一项有趣的挑战,它涉及到用户界面的动态定制和主题管理。在实现这个功能的过程中,开发者需要深入理解Android系统的组件、事件监听以及数据存储机制。以下是一些关键的知识点: ...

    Android 应用 更换皮肤(zip实现)

    在Android应用开发中,更换皮肤是一项常见的需求,它允许用户根据个人喜好自定义应用的外观。本文将深入探讨如何通过zip文件实现这一功能,主要涉及的技术包括资源管理、ZipFile类的使用以及动态加载。 首先,皮肤...

    Android 应用 更换皮肤(skin apk安装实现)

    2. **动态加载资源**:在应用启动或者用户切换皮肤时,程序需要能够动态地替换当前使用的资源。这通常通过反射和自定义资源加载器来实现。你可以创建一个`SkinManager`类,该类负责加载和切换皮肤。它会遍历skin APK...

    Android之主题皮肤实现

    主题(Theme)是Android系统提供的一种全局样式设定,它可以控制应用程序的整体外观,包括字体颜色、背景色、按钮样式等。皮肤(Skin)则是主题的一个变体,它允许用户根据个人喜好更改应用的视觉风格,而无需改变...

    Android应用源码安卓软件实现动态皮肤更换.zip

    在Android平台上,动态皮肤更换是一项常见的用户自定义功能,它允许用户根据个人喜好更改应用程序的外观。本资源“Android应用源码安卓软件实现动态皮肤更换.zip”提供了实现这一功能的源代码,对于开发者来说,这是...

    更换程序皮肤示例(含源代码)

    在IT行业中,程序皮肤是一种非常重要的用户界面设计元素,它允许用户根据个人喜好自定义软件的外观。"更换程序皮肤示例(含源代码)"是一个实用的学习资源,旨在教授开发者如何实现程序皮肤的更换功能。这个压缩包...

    Android应用皮肤切换Demo

    在Android开发中,皮肤切换是一种常见的用户界面定制技术,它允许用户根据个人喜好更改应用程序的外观。本Demo主要展示了如何在Android应用中实现皮肤切换功能,以提供更丰富的用户体验。以下将详细介绍Android应用...

    Android 应用更换皮肤实现方法

    - 在应用程序APK和皮肤APK的`AndroidManifest.xml`中配置`android:sharedUserId="com.yee"`。 2. **文件命名一致性**: - 确保应用APK和皮肤APK中对于同一功能的资源文件名相同。例如,如果应用APK中的图片文件名...

    Android 换皮肤源码.zip

    "Android 换皮肤源码.zip"可能包含了一个实现这一功能的示例项目,我们可以从这个压缩包中的两个文件名"Re_Skin1"和"Re_Skin"推测,它们可能是实现换肤功能的不同部分或者不同版本。 Android换肤技术主要涉及到以下...

    换皮肤程序

    在IT领域,"换皮肤程序"是一种允许用户自定义软件界面外观的应用,它通常通过提供多种主题或皮肤供用户选择,以实现个性化定制。这样的功能不仅提升了用户体验,也让软件更符合个人审美,增加了用户与软件的互动性。...

    Android程序研发源码Android 实现皮肤打包成apk的demo.zip

    本示例"Android程序研发源码Android 实现皮肤打包成apk的demo"提供了如何将皮肤打包成一个可独立安装的APK文件的详细实现。通过分析这个Demo,我们可以学习到以下关键知识点: 1. **皮肤资源管理**: - 皮肤通常...

    android app皮肤更换方案

    这个类需要能够读取皮肤配置,如皮肤ID、资源路径等,并在应用程序启动时或用户手动切换时更新全局的主题设置。可以使用SharedPreferences存储用户的皮肤选择,以便在下次启动应用时自动加载。 工具的使用在皮肤...

    Android程序研发源码点心桌面皮肤源码.zip

    这份"Android程序研发源码点心桌面皮肤源码.zip"包含的源代码是点心桌面皮肤开发的关键组成部分,对于Android开发者,尤其是对UI设计和自定义组件感兴趣的开发者来说,这是一个宝贵的资源。 首先,我们可以从这个...

    Android模拟器皮肤 三个新的

    了解并适配各种Android模拟器皮肤对于开发者来说至关重要,因为这样可以确保应用程序在不同设备上的一致性与稳定性。通过使用这些新的皮肤,开发者可以更全面地测试其应用,提高用户满意度,并减少因设备兼容性问题...

    Android 实现皮肤打包成apk的demo.zip

    在Android开发中,皮肤是一种常见的应用定制方式,它允许用户根据个人喜好更改应用程序的外观。本教程将介绍如何将Android皮肤打包成一个可独立安装的APK文件,从而实现皮肤的动态更换。以下是对该主题的详细阐述: ...

    更换皮肤SKIN

    2. **本地皮肤框架**:这是一种允许用户从本地存储(如计算机硬盘)选择和应用皮肤的架构。它通常包含一个皮肤管理器,负责读取、解析和应用皮肤文件。框架还可能包括一套标准,规定皮肤文件的结构和格式,以便于...

    android换皮肤

    在Android开发中,换肤功能是一项常见的需求,它允许用户根据个人喜好更改应用程序的外观,包括布局(layout)、字符串(string)以及样式(style)等资源。本文将深入探讨如何在Android应用中实现这一功能。 首先...

Global site tag (gtag.js) - Google Analytics