Android theme应用主题实现

Android实现应用Theme的方式是通过apk来实现的。下面是一个demo。

1.首先必须新建一个apk,类似的插件,然后在该apk的AndroidManifest.xml文件的application加上一个meta-data。这个是下一步查找是否是自己的插件的apk做一个标记。

<meta-data android:name="skin_demo2_plugin" android:value="com.example.skindemo2.icon"/>

2.在该apk添加一些图片,也可以用其他(包括style等)这里主要是为了演示。在该apk的MainActivity定义一个方法。这里主要为了方便主apk快速调用这个方法。

static int allDrawableId[] = {R.drawable.img_apparel_accessories,R.drawable.img_computers_software

,R.drawable.img_electro,R.drawable.img_electronics,R.drawable.img_entertaiment

,R.drawable.img_food_beverage,R.drawable.img_kids_baby,R.drawable.img_sport,R.drawable.img_toys_games};

public int getDrawableIdForOtherApp(int position){

if(position < allDrawableId.length){

return allDrawableId[position];

}

return 0;

}

3.在主apk中通过读取所有安装的应用,通过分析applicationInfo的meta-data,然后判断是否是自己的插件apk。

然后通过context.createPackageContext(packageName,int flag)得到相应插件的context。然后通过类加载器得到MainActivity的class类,然后通过反射得到方法返回的值。然后就可以得到drawable对象。

package com.example.skindemo2;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.List;

import android.os.AsyncTask;

import android.os.Bundle;

import android.app.Activity;

import android.content.Context;

import android.content.pm.ApplicationInfo;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.content.pm.PackageManager.NameNotFoundException;

import android.graphics.drawable.Drawable;

import android.view.View;

import android.widget.Button;

import android.widget.ImageView;

public class MainActivity extends Activity {

private Button mSwtichImgBgBtn;

private ImageView mShowImg;

private Context context;

private ArrayList<String> mPluginPackageNameList = new ArrayList<String>();

private int position = 0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

context = this;

mSwtichImgBgBtn = (Button) this.findViewById(R.id.swtichImgBgBtn);

mSwtichImgBgBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

swtichImgUsePlugin();

}

});

mShowImg = (ImageView) this.findViewById(R.id.myShowImg);

new AsyncTask<Void, Void, Void>() {

@Override

protected Void doInBackground(Void... params) {

findPluginPackageName();

return null;

}

@Override

protected void onPostExecute(Void result) {

swtichImgUsePlugin();

super.onPostExecute(result);

}

}.execute();

}

private void findPluginPackageName() {

PackageManager pm = context.getPackageManager();

List<PackageInfo> list = pm.getInstalledPackages(0);//得到所有安装的apk的PackageInfo

String meta = null;

ApplicationInfo aInfo = null;

for (PackageInfo pi : list) {

String pkgName = pi.packageName;

try {

aInfo = pm.getApplicationInfo(pkgName,

PackageManager.GET_META_DATA);

} catch (NameNotFoundException e) {

e.printStackTrace();

}

if (aInfo == null || aInfo.metaData == null)

continue;

meta = aInfo.metaData.getString("skin_demo2_plugin");

if (meta == null || "".equals(meta))

continue;

if ("com.example.skindemo2.icon".equals(meta)) {

//通过meta的值判断是否是自己的插件apk

mPluginPackageNameList.add(aInfo.packageName);

}

}

}

//必须在主线程中操作

private void swtichImgUsePlugin() {

//我这里为了方便直接就取了第一个插件apk数据,实际中是通过用户选择的apk来切换

if (mPluginPackageNameList.size() != 0) {

try {

//通过createPackageContext方法得到插件apk的context

Context otherplusContext = context.createPackageContext(

mPluginPackageNameList.get(0),

Context.CONTEXT_INCLUDE_CODE

| Context.CONTEXT_IGNORE_SECURITY);

//通过得到插件apk的context类加载器,然后得到MainActvity的类对象

Class<?> mainClass = otherplusContext

.getClassLoader()

.loadClass(mPluginPackageNameList.get(0) + ".MainActivity");

//通过反射得到相应位置的drawable

Method m = mainClass.getMethod("getDrawableIdForOtherApp",

int.class);

int imgBgId = (Integer) m.invoke(mainClass.newInstance(), position);

//为了可以循环切换img

if(imgBgId == 0){

position = 0;

}else{

position += 1;

}

//得到drawable对象

Drawable drawable = otherplusContext.getResources()

.getDrawable(imgBgId);

mShowImg.setImageDrawable(drawable);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

时间: 2024-08-26 19:24:48

Android theme应用主题实现的相关文章

Android应用界面主题Theme使用方法

主题Theme就是用来设置界面UI风格,可以设置整个应用或者某个活动Activity的界面风格.在Android SDK中内置了下面的Theme,可以按标题栏Title Bar和状态栏Status Bar是否可见来分类: [html] view plaincopyprint? •android:theme="@android:style/Theme.Dialog"   将一个Activity显示为能话框模式 •android:theme="@android:style/The

Android 样式和主题(style &amp; theme)

Android 样式 android中的样式和CSS样式作用相似,都是用于为界面元素定义显示风格,它是一个包含一个或者多个view控件属性的集合.如:需要定义字体的颜色和大小. 在CSS中是这样定义的: <style> .wu{COLOR:#0000CC;font-size:18px;} </style> 可以像这样使用上面的css样式:<div class="wu">wuyudong‘blog</div> 在Android中可以这样定义

android 自带主题样式(theme )

android:theme="@android:style/Theme.Dialog" 将一个Activity显示为能话框模式 android:theme="@android:style/Theme.NoTitleBar" 不显示应用程序标题栏 android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 不显示应用程序标题栏,并全屏 android:theme="Theme.Li

Android Theme主题继承(SDK下主题和v7包下主题)

主题样式在styles.xml文件里,一般有两种继承: 继承android主题 <style name="AppBaseTheme" parent="android:Theme.Holo"> 重写样式的话name中需要加上android:,可以看到parent父类引用就用到了parent="android:Theme.Holo" <item name="android:actionBarStyle">@

[android] 练习样式主题自定义activity切换动画

主要练习了自定义样式和主题,继承android系统默认的样式并修改,练习xml定义淡入淡出动画 anim/fade_in.xml <?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:from

Android系统自带样式(android:theme)

From: http://blog.csdn.net/dawanganban/article/details/17732701 http://www.cnblogs.com/bluestorm/archive/2012/07/12/2588724.html android:theme="@android:style/Theme.Dialog" : Activity显示为对话框模式 android:theme="@android:style/Theme.NoTitleBar&q

Android Theme and style

每家公司的app都有自己的统一的特色,这就涉及到theme和style,当然他们只不是仅仅为了这个特点存在,想activity的进入动画等都能通过theme和style实现,简单并且减少了代码数,熟练使用theme and style也能做出很炫的效果. what is theme ? 主题是对整个应用中所有的Activity都起作用,或者对指定的Activity起作用 定义格式通常是改变窗口的外观格式,标题,边框等 . what is style ? 为每个View重复地指定字体,颜色等属性,

Android 标签的主题样式

Android平台定义的主题样式: android:theme="@android:style/Theme.Dialog"   将一个Activity显示为对话框模式 •android:theme="@android:style/Theme.NoTitleBar"  不显示应用程序标题栏•android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不显示应用程序标题栏,并全屏 •andr

Android Theme详细内容概述(转)

Android手机操作系统是一个开源的操作系统.其应用方式灵活方便,极受广大编程人员的喜爱.我们在这里就可以先来了解一下Android Theme的具体用法.Android Theme的用法与style的差不多,不过,具体还是有些不一样的 首先在values下新建一个theme.xml,用来定义需要的theme了,代码如下: Xml代码 < ?xml version="1.0" encoding="utf-8"?> < resources>