原文地址:http://blog.csdn.net/ithouse/article/details/51917759
1.首先,作为SDK的项目查找界面时不能按常规的套路来,之前的Activity设置界面是setContentView(R.layout.activity_main)。现在提供一个资源工具类(据说是一个天才少年写的,我直接复制给大家了),所有资源都通过该类查找。
package com.vzone.tmdsdk.tool;
import java.lang.reflect.Field;
import android.content.Context;
/**
* Desction: Author:pengjianbo Date:15/10/22 下午9:01
*/
public class ResourceUtils {
/**
* 获取 layout 布局文件
*
* @param context
* Context
* @param resName
* layout xml 的文件名
* @return layout
*/
public static int getLayoutId(Context context, String resName) {
return context.getResources().getIdentifier(resName, "layout",
context.getPackageName());
}
/**
* 获取 string 值
*
* @param context
* Context
* @param resName
* string name的名称
* @return string
*/
public static int getStringId(Context context, String resName) {
return context.getResources().getIdentifier(resName, "string",
context.getPackageName());
}
/**
* 获取 drawable 布局文件 或者 图片的
*
* @param context
* Context
* @param resName
* drawable 的名称
* @return drawable
*/
public static int getDrawableId(Context context, String resName) {
return context.getResources().getIdentifier(resName, "drawable",
context.getPackageName());
}
/**
* 获取 style
*
* @param context
* Context
* @param resName
* style的名称
* @return style
*/
public static int getStyleId(Context context, String resName) {
return context.getResources().getIdentifier(resName, "style",
context.getPackageName());
}
/**
* 获取 styleable
*
* @param context
* Context
* @param resName
* styleable 的名称
* @return styleable
*/
/**
* 获取 anim
*
* @param context
* Context
* @param resName
* anim xml 文件名称
* @return anim
*/
public static int getAnimId(Context context, String resName) {
return context.getResources().getIdentifier(resName, "anim",
context.getPackageName());
}
/**
* 获取 id
*
* @param context
* Context
* @param resName
* id 的名称
* @return
*/
public static int getId(Context context, String resName) {
return context.getResources().getIdentifier(resName, "id",
context.getPackageName());
}
/**
* color
*
* @param context
* Context
* @param resName
* color 名称
* @return
*/
public static int getColorId(Context context, String resName) {
return context.getResources().getIdentifier(resName, "color",
context.getPackageName());
}
private static Object getResourceId(Context context, String name, String type) {
String className = context.getPackageName() + ".R";
try {
Class<?> cls = Class.forName(className);
for (Class<?> childClass : cls.getClasses()) {
String simple = childClass.getSimpleName();
if (simple.equals(type)) {
for (Field field : childClass.getFields()) {
String fieldName = field.getName();
if (fieldName.equals(name)) {
System.out.println(fieldName);
return field.get(null);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取styleable的ID号数组
*/
public static int[] getStyleableArray(Context context,String name) {
return (int[])getResourceId(context, name,"styleable");
}
/**
*context.getResources().getIdentifier无法获取到styleable的数据
*/
public static int getStyleable(Context context, String name) {
return ((Integer)getResourceId(context, name,"styleable")).intValue();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
自定义view属性的获取:
TypedArray a = context.obtainStyledAttributes(attrs, ResourceUtils.getStyleableArray(context, "CircleImageView"), defStyle, 0)
mBorderWidth = a.getDimensionPixelSize(ResourceUtils.getStyleable(context, "CircleImageView_civ_border_width"), DEFAULT_BORDER_WIDTH)
mBorderColor = a.getColor(ResourceUtils.getStyleable(context, "CircleImageView_civ_border_color"), DEFAULT_BORDER_COLOR)
mBorderOverlay = a.getBoolean(ResourceUtils.getStyleable(context, "CircleImageView_civ_border_overlay"), DEFAULT_BORDER_OVERLAY)
mFillColor = a.getColor(ResourceUtils.getStyleable(context, "CircleImageView_civ_fill_color"), DEFAULT_FILL_COLOR)
a.recycle()
2.确保所有资源的名字唯一,比如预设的activity_main.xml最好改一个名字,因为引用SDK的人(后面称为Client)很可能也有一个xml文件叫做activity_main.xml。
3.所有涉及到声明的东西,必须在Client的AndroidManifest.xml中声明,比如权限、Activity、Service、BroadcastReceiver等(仅针对eclipse,AndroidStudio另算)。
4.lib打包成jar时,除了src以外其他都不能选择。
5.将jar包混淆,参考http://blog.csdn.net/ithouse/article/details/51605955
6.删除你之前SDK项目中src目录下的所有源码,拷贝混淆之后的jar包到SDK项目的libs目录下。
7.将该SDK项目发布出去,让Client引用该项目即可。