`
104zz
  • 浏览: 1507866 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

基于android的主题插件编写

阅读更多

基于android的主题插件编写

 

   前一段,写了一个主题插件,刚接到这个任务时,根本不知道从哪下手,于是就上网搜了一些资料,下面来讲一下我是怎么做这个主题插件的。

  首先,我们需要引入一个插件包。这个架包是从网上下的,该作者的博客地址:http://hangxin1940.cnblogs.com/。这个架包封装了查找插件的功能,查找插件功能的功能等等,不需要我们自己在写,很方便。大家可以看看。

  其次,我们要对自己的主程序的AndroidManifest.xml进行修改.

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

    package="你的app包名"

     android:sharedUserId="你自己设的"

    android:versionCode="1"

android:versionName="1.0" >

这里的package和sharedUserId都是必须写的。写package方便我们在主程序中获取插件的Context对象,去引用插件的内部资源。而sharedUserId的值必须和主程序一致,可以保证我们的插件和主程序共享一个进程,消除权限堡垒,方便我们共享两个程序之间的资源

 

  接下来,我们需要在主程序中写查找插件的代码

          // 首先,就是查找插件

        PluginSearchpsearch = newPluginSearch();

        List<Plugin>plugins = psearch.getPlugins(context);

 

        // 然后将插件再组装一下

        PluginBuilderpbuilder = newPluginBuilder(context);

        plugins= pbuilder.buildPluginsDescrition(plugins);

 

        // 显示出所有插件

        flateUI(plugins);

 

then,我们要显示插件皮肤,并调用插件中写的方法(即实现的功能)

 

    for (final Pluginplug : plugins) {

            // 加入插件

            ThemePluginItemitem = newThemePluginItem(this);

 

            // 获取插件的描述对象

PluginDescription<MainDescript> pdes = newPluginDescription<MainDescript>(

                    MainDescript.class);

            MainDescriptdes;

            try {

                des= pdes.getDescription(this, plug);

                // 设置插件item的描述信息

                Drawabled = plug.getContext().getResources()

                        .getDrawable(des.getIconResId());

                item.setDrawableTheme(d);

 

            }catch(java.lang.InstantiationException e1) {

                // TODOAuto-generated catch block

                e1.printStackTrace();

            }

 

            // 获得当前插件的功能

            List<PluginFeature>features = plug.getFeatures();

 

            // 遍历功能

            for (finalPluginFeature pf : features) {

 

                for (finalPluginFeatureMethod fm : pf.getMethods()) {

 

                    // 添加插件,并且设置执行事件

                    item.addPluginMethod(fm,new OnClickListener(){

 

                        @Override

                        public voidonClick(View v) {

                                        PluginInvokepi = newPluginInvoke(getApplicationContext());

                           

                            try {

                                try {

                                    pi.invoke(plug,pf, fm);

                            }catch (java.lang.InstantiationExceptione) {

                                   

                                    e.printStackTrace();

                                }

//注意这个地方:我本想用反射在插件中调用主程序的方法,但是一直出错。

//并不是主程序的所有资源我们都可以调用的,比如说控件,我们是不可能使用其他应用程序的//插件的,所以一些功能还是要在主程序中写的

                                if(mIsUpdate){

                                    setBabySkinIsupdate();

                                }else {

                                    setBabySkin();

                                }

                                alertDialog.dismiss();

                           

                            }catch(SecurityException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(IllegalArgumentException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(NameNotFoundException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(ClassNotFoundException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(IllegalAccessException e) {

                                // TODOAuto-generated catch block

                             } catch(InstantiationException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(NoSuchMethodException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(InvocationTargetException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }

                        }

                    });

                }

            }

            // 将插件加入到ui

            addThemeLayout.addView(item);

 

        }

   主程序中还需要再写一个类,来调用执行插件的功能,这是ThemePluginItem类中执行插件方法的代码

public voidaddPluginMethod(PluginFeatureMethod method,OnClickListener ocl){

//这是调用插件方法的接口形式,可以是Button控件在主程序中显示,也可以是ImageView等其他控件。

        ImageViewthemeImageView  = newImageView(mContext);

        LinearLayout.LayoutParamslayoutParams = newLinearLayout.LayoutParams(75, 75);

        layoutParams.setMargins(7,5, 5, 5);

        themeImageView.setLayoutParams(layoutParams);

        //themeImageView.setImageResource(R.drawable.baby_info_pink);

        themeImageView.setImageDrawable(getDrawableTheme());

        themeImageView.setAdjustViewBounds(false);

          themeImageView.setClickable(true);         

        themeImageView.setScaleType(ScaleType.CENTER);     

        //这是触发插件的功能

themeImageView.setOnClickListener(ocl);

//我们要把插件放到主程序中显示

        otherThemeLayout.addView(themeImageView);

               

    }

以上是主程序中查找插件并调用插件的过程,下面讲一下插件中的功能是怎么共享主程序的文件。

我们知道在写主题功能时,为了分清我们触发的是哪个皮肤,我们需要为每个皮肤进行编号,并把这些内容用Sharepreference方法存储到一个文件中,方便我们调用和使用,但是在插件中如何去共享并操作这份文件呢,android已经为我们提供这样一些参数

 

MODE_PRIVATE 0 代表了该文件只为本程序所访问

MODE_WORLD_READABLE 1 代表了该文件可以被其他程序读取

MODE_WORLD_WRITEABLE 2 代表了该文件可以被其他程序写

 

//首先,我们需要得到主程序的context对象

 Contextc= context.createPackageContext(你要调用的项目的包名, Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);

        //这里面有两个参数,第一个是你的文件名,第二个:设置你的文件权限

            SharedPreferencesmSharedPreferences = c.getSharedPreferences(你要调用的项目的包名, context.MODE_WORLD_READABLE|context.MODE_WORLD_WRITEABLE);

            EditormEditor = mSharedPreferences.edit();

//获取该文件的isupdate对应的值

    boolean mIsUpdate= mSharedPreferences.getBoolean("isupdate"false);

//在文件中写入自己想存入的值

    mEditor.putInt(mBabyID+ "", mNewBabySkin);

 

 

这样我们就达到了共享文件的功能。

前面已经说明我们无法共享控件,所以设置主程序的皮肤还是要是要在主程序中设置。

在这个环节,最重要的就是获取插件的资源

//获取插件的Context对象

Context c=context.createPackageContext(你要调用的项目的包名,

                                  Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);

//获取插件的资源resources对象,这样我们就可以获取插件中的资源

    ResourcespluginResources = c.getResources();

//获取插件中的图片,这里千万不要以为只用获取插件图片的ID,就可以让主程序来引用,我们要知道每个应用程序都有一个R文件,这里面的数都是自动生成且唯一的,而且只包含本程序的资源,所以我们要用这种方法获得插件中的图片资源

 

babyYellowBg =pluginResources.getDrawable(pluginResources.getIdentifier("你的图片名称""drawable",

          你要调用的项目的包名));

在这里我们的主程序就可以直接引用了

         scrollView.setBackgroundDrawable(babyYellowBg);

 

最后, 我需要告诉你大家,我们在主程序中引用插件中的资源或者插件引用主程序中的资源时,不能引用style.xml中的值,因为他属于多属性值,android还没有提供相应的方法来直接引用,如果哪位读者找到了读取插件style文件的方法,还望不吝赐教

 基于android的主题插件编写

   前一段,写了一个主题插件,刚接到这个任务时,根本不知道从哪下手,于是就上网搜了一些资料,下面来讲一下我是怎么做这个主题插件的。

  首先,我们需要引入一个插件包。这个架包是从网上下的,该作者的博客地址:http://hangxin1940.cnblogs.com/。这个架包封装了查找插件的功能,查找插件功能的功能等等,不需要我们自己在写,很方便。大家可以看看。

  其次,我们要对自己的主程序的AndroidManifest.xml进行修改.

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

    package="你的app包名"

     android:sharedUserId="你自己设的"

    android:versionCode="1"

android:versionName="1.0" >

这里的package和sharedUserId都是必须写的。写package方便我们在主程序中获取插件的Context对象,去引用插件的内部资源。而sharedUserId的值必须和主程序一致,可以保证我们的插件和主程序共享一个进程,消除权限堡垒,方便我们共享两个程序之间的资源

 

  接下来,我们需要在主程序中写查找插件的代码

          // 首先,就是查找插件

        PluginSearchpsearch = newPluginSearch();

        List<Plugin>plugins = psearch.getPlugins(context);

 

        // 然后将插件再组装一下

        PluginBuilderpbuilder = newPluginBuilder(context);

        plugins= pbuilder.buildPluginsDescrition(plugins);

 

        // 显示出所有插件

        flateUI(plugins);

 

then,我们要显示插件皮肤,并调用插件中写的方法(即实现的功能)

 

    for (final Pluginplug : plugins) {

            // 加入插件

            ThemePluginItemitem = newThemePluginItem(this);

 

            // 获取插件的描述对象

PluginDescription<MainDescript> pdes = newPluginDescription<MainDescript>(

                    MainDescript.class);

            MainDescriptdes;

            try {

                des= pdes.getDescription(this, plug);

                // 设置插件item的描述信息

                Drawabled = plug.getContext().getResources()

                        .getDrawable(des.getIconResId());

                item.setDrawableTheme(d);

 

            }catch(java.lang.InstantiationException e1) {

                // TODOAuto-generated catch block

                e1.printStackTrace();

            }

 

            // 获得当前插件的功能

            List<PluginFeature>features = plug.getFeatures();

 

            // 遍历功能

            for (finalPluginFeature pf : features) {

 

                for (finalPluginFeatureMethod fm : pf.getMethods()) {

 

                    // 添加插件,并且设置执行事件

                    item.addPluginMethod(fm,new OnClickListener(){

 

                        @Override

                        public voidonClick(View v) {

                                        PluginInvokepi = newPluginInvoke(getApplicationContext());

                           

                            try {

                                try {

                                    pi.invoke(plug,pf, fm);

                            }catch (java.lang.InstantiationExceptione) {

                                   

                                    e.printStackTrace();

                                }

//注意这个地方:我本想用反射在插件中调用主程序的方法,但是一直出错。

//并不是主程序的所有资源我们都可以调用的,比如说控件,我们是不可能使用其他应用程序的//插件的,所以一些功能还是要在主程序中写的

                                if(mIsUpdate){

                                    setBabySkinIsupdate();

                                }else {

                                    setBabySkin();

                                }

                                alertDialog.dismiss();

                           

                            }catch(SecurityException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(IllegalArgumentException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(NameNotFoundException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(ClassNotFoundException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(IllegalAccessException e) {

                                // TODOAuto-generated catch block

                             } catch(InstantiationException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(NoSuchMethodException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }catch(InvocationTargetException e) {

                                // TODOAuto-generated catch block

                                e.printStackTrace();

                            }

                        }

                    });

                }

            }

            // 将插件加入到ui

            addThemeLayout.addView(item);

 

        }

   主程序中还需要再写一个类,来调用执行插件的功能,这是ThemePluginItem类中执行插件方法的代码

public voidaddPluginMethod(PluginFeatureMethod method,OnClickListener ocl){

//这是调用插件方法的接口形式,可以是Button控件在主程序中显示,也可以是ImageView等其他控件。

        ImageViewthemeImageView  = newImageView(mContext);

        LinearLayout.LayoutParamslayoutParams = newLinearLayout.LayoutParams(75, 75);

        layoutParams.setMargins(7,5, 5, 5);

        themeImageView.setLayoutParams(layoutParams);

        //themeImageView.setImageResource(R.drawable.baby_info_pink);

        themeImageView.setImageDrawable(getDrawableTheme());

        themeImageView.setAdjustViewBounds(false);

          themeImageView.setClickable(true);         

        themeImageView.setScaleType(ScaleType.CENTER);     

        //这是触发插件的功能

themeImageView.setOnClickListener(ocl);

//我们要把插件放到主程序中显示

        otherThemeLayout.addView(themeImageView);

               

    }

以上是主程序中查找插件并调用插件的过程,下面讲一下插件中的功能是怎么共享主程序的文件。

我们知道在写主题功能时,为了分清我们触发的是哪个皮肤,我们需要为每个皮肤进行编号,并把这些内容用Sharepreference方法存储到一个文件中,方便我们调用和使用,但是在插件中如何去共享并操作这份文件呢,android已经为我们提供这样一些参数

 

MODE_PRIVATE 0 代表了该文件只为本程序所访问

MODE_WORLD_READABLE 1 代表了该文件可以被其他程序读取

MODE_WORLD_WRITEABLE 2 代表了该文件可以被其他程序写

 

//首先,我们需要得到主程序的context对象

 Contextc= context.createPackageContext(你要调用的项目的包名, Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);

        //这里面有两个参数,第一个是你的文件名,第二个:设置你的文件权限

            SharedPreferencesmSharedPreferences = c.getSharedPreferences(你要调用的项目的包名, context.MODE_WORLD_READABLE|context.MODE_WORLD_WRITEABLE);

            EditormEditor = mSharedPreferences.edit();

//获取该文件的isupdate对应的值

    boolean mIsUpdate= mSharedPreferences.getBoolean("isupdate"false);

//在文件中写入自己想存入的值

    mEditor.putInt(mBabyID+ "", mNewBabySkin);

 

 

这样我们就达到了共享文件的功能。

前面已经说明我们无法共享控件,所以设置主程序的皮肤还是要是要在主程序中设置。

在这个环节,最重要的就是获取插件的资源

//获取插件的Context对象

Context c=context.createPackageContext(你要调用的项目的包名,

                                  Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);

//获取插件的资源resources对象,这样我们就可以获取插件中的资源

    ResourcespluginResources = c.getResources();

//获取插件中的图片,这里千万不要以为只用获取插件图片的ID,就可以让主程序来引用,我们要知道每个应用程序都有一个R文件,这里面的数都是自动生成且唯一的,而且只包含本程序的资源,所以我们要用这种方法获得插件中的图片资源

 

babyYellowBg =pluginResources.getDrawable(pluginResources.getIdentifier("你的图片名称""drawable",

          你要调用的项目的包名));

在这里我们的主程序就可以直接引用了

         scrollView.setBackgroundDrawable(babyYellowBg);

 

最后, 我需要告诉你大家,我们在主程序中引用插件中的资源或者插件引用主程序中的资源时,不能引用style.xml中的值,因为他属于多属性值,android还没有提供相应的方法来直接引用,如果哪位读者找到了读取插件style文件的方法,还望不吝赐教

转载至:http://blog.csdn.net/a1027317350/article/details/9032417

分享到:
评论

相关推荐

    带Androidlogger插件的notepad++

    综上所述,"带Androidlogger插件的notepad++"提供了一个集成化的Android开发环境,结合了Notepad++的强大编辑功能与Androidlogger插件的日志查看能力,使得Android开发者可以更加便捷、高效地进行代码编写和调试工作...

    Android-基于请求接口自动生成Builder类的AndroidStudio插件

    "Android-基于请求接口自动生成Builder类的Android Studio插件"正是一款针对这一需求设计的工具,它能自动化创建Builder类,减少手动编写代码的工作量,提高开发效率。 该插件主要功能是解析指定的网络请求接口,...

    基于Android的贪吃蛇游戏.doc

    基于 Android 的贪吃蛇游戏开发需要掌握 Android 软件开发的基本知识和技能,包括 Eclipse 集成开发环境、Java 语言、XML 布局文件、Android 项目框架、视图 layout 的 xml 编写等。本文对基于 Android 的贪吃蛇游戏...

    基于android的网上订餐系统

    ### 基于Android的网上订餐系统的关键知识点 #### 一、项目背景与意义 在当前社会背景下,网络技术的飞速发展极大地推动了商业活动的数字化转型。特别是随着移动互联网技术的进步以及智能终端设备的普及,人们...

    android studio插件说明文档及demo

    1. 插件架构:Android Studio是基于IntelliJ IDEA平台构建的,因此它的插件开发也遵循IntelliJ IDEA的插件体系。理解MPS(Meta Programming System)和SDK(Software Development Kit)是开发Android Studio插件的...

    基于Android的成语PK游戏 (源码 + 演示视频)

    "基于Android的成语PK游戏 (源码 + 演示视频)" 这个标题揭示了我们讨论的主题是一款专为Android平台开发的成语竞技类游戏。"基于Android"表明游戏是针对Android操作系统设计的,适用于各种Android设备。"成语PK游戏...

    Android Studio代码高亮插件

    至于"IntelliJ IDEA Global Settings",这是IntelliJ IDEA(Android Studio基于此平台)的全局设置备份,可能包括了你的个性化配置,如插件、代码风格、键盘绑定等。 总的来说,使用代码高亮插件能显著提高Android ...

    基于java开发的uniapp原生android tcp插件.zip

    【标题】"基于Java开发的uniapp原生Android TCP插件"揭示了这个项目的核心内容,即使用Java语言为uniapp框架开发了一款专门用于Android平台的原生TCP通信插件。uniapp是一个多端开发框架,允许开发者使用一套代码...

    基于Android的焦点新闻APP的设计与实现(源码 + 说明文档 + 演示视频)

    基于Android的焦点新闻APP的设计与实现(源码 + 说明文档 + 演示视频) 第4章 系统总体设计 17 4.1 概述 17 4.2 设计原则 17 4.3 Android应用程序结构剖析 17 4.4 系统功能结构图 23 第5章 系统的实现 25 5.1 软件...

    Ionic编写插件-android版.pdf

    本文件详细介绍如何在使用Ionic框架开发Android应用时编写插件,涵盖了从搭建插件结构到编写、调试以及测试的整个流程。下面,我们将详细解释这些步骤及其相关知识点。 ### 一、插件的常见命令 在开发插件的过程中...

    Android混合开发自定义Cordova插件

    本文将深入探讨"Android混合开发自定义Cordova插件"这一主题,基于提供的资源,我们将理解如何创建Cordova项目,以及如何自定义插件以扩展其功能。 1. **Cordova基础** - Cordova的核心概念是WebView,它是一个...

    基于Android平台的个人理财系统

    Eclipse提供了丰富的插件和工具,使得开发者能够高效地编写、调试和优化代码。 Sqlite作为该项目的核心组件,是Android系统内置的关系型数据库,用于持久化存储用户的财务数据。Sqlite轻量级、高效且易于使用,特别...

    基于Android系统的电子书阅读器的设计与实现

    该论文旨在通过设计一款基于Android系统的电子书阅读器,满足用户对于高质量阅读体验的需求,并探讨如何在有限的移动设备资源下优化性能。 #### 关键技术与实现 **1. Android平台及Java语言** - **Android平台**...

    基于Android Studio开发的安卓的音乐播放器app

    在本项目中,Android Studio是开发的基础平台,它的Gradle构建系统和Android插件使我们能够轻松管理依赖和构建不同版本的应用。 对于音乐播放器的基本功能,我们可以从以下几个方面进行讲解: 1. **登录与注册**:...

    android插件,与原生的衔接

    3. ** Android插件开发:** - 在Android端,你需要创建一个继承自CordovaPlugin的Java类,重写`execute`方法以处理JavaScript的请求。 - 使用`@Override`注解的`execute`方法会接收到JavaScript传递过来的参数,并...

    基于 Android studio 开发的记账本,带有详细报告

    这两个版本分别代表了不同时间点的稳定版本,它们可能包含不同的特性、性能优化以及对Android插件的支持。例如, Gradle 3.3.0可能更多地关注稳定性和兼容性,而5.4.1则可能引入了一些新的API和改进,如更快的构建...

    基于Android的健康饮食小助手(源码 + 说明文档 + 演示视频)

    【基于Android的健康饮食小助手】是一款专门为用户打造的健康管理应用程序,它集合了源码、说明文档和演示视频,提供了一整套完善的解决方案。这款应用旨在帮助用户关注日常饮食,实现健康生活的目标。 1. **...

    基于Android Studio实现的2048小游戏源代码,安卓大作业

    本篇文章将深入探讨如何基于Android Studio开发2048小游戏,以供安卓开发学习者参考。 首先,Android Studio是Google推出的一款强大的Android应用开发集成环境,集成了编译、调试、模拟器等工具,使得Android应用...

    基于Android平台的星座查询软件设计

    4.1.3更新Ec1ipse并下载ADT(Android开发插件) 18 4.1.4使用Ec1ipse开发Android应用 19 4.2“星座”查询软件程序中各类组件 20 4.2.1 Package Explorer中的组件 20 4.2.2应用程序的资源 21 4.2.3布局文件main.xml 21 ...

Global site tag (gtag.js) - Google Analytics