转: http://www.it165.net/pro/html/201504/38370.html?bsh_bid=950898232
|
运行模拟器的时候总是会内存错误。 |
这种情况偶尔出现,没什么关系,不用管他。点击‘取消’就可以了。
经常出现就危险了,弄不好就得重装系统了。
运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭。
“0x????????”指令引用的“0x????????”内存。该内存不能为“read”。
“0x????????”指令引用的“0x????????”内存,该内存不能为“written”。
一般出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件
开始 运行 输入:cmd 确定:
在DOS提示符下输入:
for %1 in (%windir%system32*.dll) do regsvr32.exe /s %1
等待3分钟,左右后,搞定了。(如果怕输错,就把这句话复制上去)。
四十七、通过路径获取媒体文件信息
通过路径获取媒体文件信息 http://blog.csdn.net/aomandeshangxiao/article/details/6600725
四十八、Java中有用的文件操作
java文件操作 http://blog.csdn.net/aomandeshangxiao/article/details/6597302
四十九、Android文件读写
Android文件的读写 http://blog.csdn.net/aomandeshangxiao/article/details/6589510
五十、 scaleType属性与ImagView中图片的显示的关系
五十一、 Notification的属性notification的各种属性:
http://blog.csdn.net/aomandeshangxiao/article/details/6608101
五十二、Android控件实现震动:
先在res下面新创建anim文件夹,在该文件夹中创建shake.xml文件:
1.
<?xml version=
"1.0"
encoding=
"utf-8"
?>
2.
<translate xmlns:android=
"http://schemas.android.com/apk/res/android"
3.
android:duration=
"1000"
4.
android:fromYDelta=
"0"
5.
android:toYDelta=
"10"
6.
android:fromXDelta=
"0"
7.
android:toXDelta=
"10"
8.
android:interpolator=
"@anim/cycle_7"
/>
最后引用了cycle_7,再在该文件夹中创建cycle_7.xml文件
1.
<?xml version=
"1.0"
encoding=
"utf-8"
?>
2.
3.
<cycleInterpolator xmlns:android=
"http://schemas.android.com/apk/res/android"
4.
android:cycles=
"10"
/>
在Java代码里面:
1.
Animation shake = AnimationUtils.loadAnimation(
this
, R.anim.shake);
2.
findViewById(R.id.image).startAnimation(shake);
五十三、Android 页面切换动画效果
http://hi.baidu.com/fountainblog/blog/item/66cb9918b0220eaa4bedbc2e.html
五十四、Android2.2完全退出程序
http://www.eoeandroid.com/thread-62284-1-1.html
五十五、Android按下back键非退出隐藏到后台
01.
public
boolean
onKeyDown(
int
keyCode, KeyEvent event) {
02.
if
(keyCode == KeyEvent.KEYCODE_BACK) {
03.
Intent intent =
new
Intent(Intent.ACTION_MAIN);
04.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
05.
intent.addCategory(Intent.CATEGORY_HOME);
06.
startActivity(intent);
07.
return
true
;
08.
}
09.
return
super
.onKeyDown(keyCode, event);
10.
}
五十六、在Android开发中使用Gallery实现多级联动
http://mobile.51cto.com/hot-230282.htm
五十七、获取view在屏幕中的位置:
1.
int
[] points = {
0
,
0
};
2.
view.getLocationInWindow(points);
这里用数组存储view的x和y坐标,point[0]是x坐标,point[1]是y坐标。
五十八、在图形中添加文字
01.
@Override
02.
protected
synchronized
void
onDraw(Canvas canvas) {
03.
super
.onDraw(canvas);
04.
Rect rect =
new
Rect();
05.
this
.mPaint.getTextBounds(
this
.text,
0
,
this
.text.length(), rect);
06.
int
x = (getWidth() /
2
) - rect.centerX();
07.
int
y = (getHeight() /
2
) - rect.centerY();
08.
canvas.drawText(
this
.text, x, y,
this
.mPaint);
09.
}
五十九、使用Vibrator实现手机震动
01.
@Override
02.
public
boolean
onTouchEvent(MotionEvent event) {
03.
04.
if
(event.getAction() == MotionEvent.ACTION_DOWN){
05.
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
06.
long
[] pattern = {
800
,
40
,
400
,
30
};
// OFF/ON/OFF/ON...
07.
vibrator.vibrate(pattern,
2
);
//-1不重复,非-1为从pattern的指定下标开始重复
08.
}
09.
return
super
.onTouchEvent(event);
10.
}
六十、界面重绘
invalidate()或者view.postinvalidate()方法
六十一、Android创建桌面快捷方式:
01.
/**
02.
* 为程序创建桌面快捷方式
03.
*/
04.
private
void
addShortcut(){
05.
Intent shortcut =
new
Intent(
"com.android.launcher.action.INSTALL_SHORTCUT"
);
06.
07.
//快捷方式的名称
08.
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
09.
shortcut.putExtra(
"duplicate"
,
false
);
//不允许重复创建
10.
11.
//指定当前的Activity为快捷方式启动的对象: 如 com.everest.video.VideoPlayer
12.
//注意: ComponentName的第二个参数必须加上点号(.),否则快捷方式无法启动相应程序
13.
ComponentName comp =
new
ComponentName(
this
.getPackageName(),
"."
+
this
.getLocalClassName());
14.
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,
new
Intent(Intent.ACTION_MAIN).setComponent(comp));
15.
16.
//快捷方式的图标
17.
ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(
this
, R.drawable.icon);
18.
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
19.
20.
sendBroadcast(shortcut);
21.
}
需要声明权限
1.
<uses-permission android:name=
"com.android.launcher.permission.INSTALL_SHORTCUT"
/>
参考博客:
http://www.cnblogs.com/-OYK/archive/2011/05/31/2064797.html
http://www.apkbus.com/android-17389-1-1.html
http://dev.10086.cn/cmdn/wiki/index.php?edition-view-8836-1.html六十二、android画图去锯齿效果
paint.setAntiAlias(true);
画图片的时候,前面设置没有用
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTE
六十三、获取sd卡里文件信息
01.
public
class
SDFileExplorer
extends
Activity{
02.
ListView listView;
03.
TextView textView;
04.
// 记录当前的父文件夹
05.
File currentParent;
06.
// 记录当前路径下的所有文件的文件数组
07.
File[] currentFiles;
08.
09.
@Override
10.
public
void
onCreate(Bundle savedInstanceState){
11.
super
.onCreate(savedInstanceState);
12.
setContentView(R.layout.main);
13.
//获取列出全部文件的ListView
14.
listView = (ListView) findViewById(R.id.list);
15.
textView = (TextView) findViewById(R.id.path);
16.
//获取系统的SD卡的目录
17.
File root =
new
File(
"/mnt/sdcard/"
);
18.
//如果 SD卡存在
19.
if
(root.exists()){
20.
currentParent = root;
21.
currentFiles = root.listFiles();
22.
//使用当前目录下的全部文件、文件夹来填充ListView
23.
inflateListView(currentFiles);
24.
}
25.
// 为ListView的列表项的单击事件绑定监听器
26.
listView.setOnItemClickListener(
new
OnItemClickListener(){
27.
@Override
28.
public
void
onItemClick(AdapterView<?> parent, View view,
29.
int
position,
long
id){
30.
// 用户单击了文件,直接返回,不做任何处理
31.
if
(currentFiles[position].isFile())
32.
return
;
33.
// 获取用户点击的文件夹下的所有文件
34.
File[] tmp = currentFiles[position].listFiles();
35.
if
(tmp ==
null
|| tmp.length ==
0
){
36.
Toast.makeText(SDFileExplorer.
this
,
"当前路径不可访问或该路径下没有文件"
,
37.
20000
).show();
38.
}
else
{
39.
//获取用户单击的列表项对应的文件夹,设为当前的父文件夹
40.
currentParent = currentFiles[position];
41.
//保存当前的父文件夹内的全部文件和文件夹
42.
currentFiles = tmp;
43.
// 再次更新ListView
44.
inflateListView(currentFiles);
45.
}
46.
}
47.
});
48.
// 获取上一级目录的按钮
49.
Button parent = (Button) findViewById(R.id.parent);
50.
parent.setOnClickListener(
new
OnClickListener(){
51.
@Override
52.
public
void
onClick(View source){
53.
try
{
54.
if
(!currentParent.getCanonicalPath().equals(
"/mnt/sdcard"
)){
55.
// 获取上一级目录
56.
currentParent = currentParent.getParentFile();
57.
// 列出当前目录下所有文件
58.
currentFiles = currentParent.listFiles();
59.
// 再次更新ListView
60.
inflateListView(currentFiles);
61.
}
62.
}
63.
catch
(IOException e){
64.
e.printStackTrace();
65.
}
66.
}
67.
});
68.
}
69.
70.
private
void
inflateListView(File[] files){
71.
// 创建一个List集合,List集合的元素是Map
72.
List<Map<String, Object>> listItems =
new
ArrayList<Map<String, Object>>();
73.
for
(
int
i =
0
; i < files.length; i++){
74.
Map<String, Object> listItem =
new
HashMap<String, Object>();
75.
//如果当前File是文件夹,使用folder图标;否则使用file图标
76.
if
(files[i].isDirectory()){
77.
listItem.put(
"icon"
, R.drawable.folder);
78.
}
else
{
79.
listItem.put(
"icon"
, R.drawable.file);
80.
}
81.
listItem.put(
"fileName"
, files[i].getName());
82.
//添加List项
83.
listItems.add(listItem);
84.
}
85.
// 创建一个SimpleAdapter
86.
SimpleAdapter simpleAdapter =
new
SimpleAdapter(
this
, listItems,
87.
R.layout.line,
new
String[] {
"icon"
,
"fileName"
},
new
int
[] {
88.
R.id.icon, R.id.file_name });
89.
// 为ListView设置Adapter
90.
listView.setAdapter(simpleAdapter);
91.
try
{
92.
textView.setText(
"当前路径为:"
+ currentParent.getCanonicalPath());
93.
}
catch
(IOException e){
94.
e.printStackTrace();
95.
}
96.
}
97.
}
六十四、Android标题栏显示progressBar
1.
protected
void
onCreate(Bundle savedInstanceState) {
2.
super
.onCreate(savedInstanceState);
3.
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
//先给Activity注册界面进度条功能
4.
setContentView(R.layout.main);
5.
setProgressBarIndeterminateVisibility(
true
);
//在需要显示进度条的时候调用这个方法
6.
setProgressBarIndeterminateVisibility(
false
);
//在不需要显示进度条的时候调用这个方法
7.
}
六十五、单击EditText全选内容
01.
percent.setOnTouchListener(
this
);
02.
03.
@Override
04.
public
boolean
onTouch(View v, MotionEvent event) {
05.
if
(v.getId()==R.id.seekPercent) {
06.
percent.selectAll();
07.
InputMethodManager imm = (InputMethodManager)
08.
context.getSystemService(Context.INPUT_METHOD_SERVICE);
09.
imm.showSoftInput(v,
0
);
10.
return
true
;
11.
}
12.
return
false
;
13.
}
六十六、Android设置图片圆角
01.
/**
02.
* 将图片设置为圆角
03.
*/
04.
public
static
Bitmap toRoundCorner(Bitmap bitmap,
int
pixels) {
05.
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
06.
bitmap.getHeight(), Config.ARGB_8888);
07.
Canvas canvas =
new
Canvas(output);
08.
final
int
color =
0xff424242
;
09.
final
Paint paint =
new
Paint();
10.
final
Rect rect =
new
Rect(
0
,
0
, bitmap.getWidth(), bitmap.getHeight());
11.
final
RectF rectF =
new
RectF(rect);
12.
final
float
roundPx = pixels;
13.
paint.setAntiAlias(
true
);
14.
canvas.drawARGB(
0
,
0
,
0
,
0
);
15.
paint.setColor(color);
16.
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
17.
paint.setXfermode(
new
PorterDuffXfermode(Mode.SRC_IN));
18.
canvas.drawBitmap(bitmap, rect, rect, paint);
19.
return
output;
20.
}
六十七、把图片转换成圆形
01.
bitmap = ((BitmapDrawable)imageView1.getDrawable()).getBitmap();
02.
bitmap = getRoundedCornerBitmap(bitmap);
03.
imageView1.setImageBitmap(bitmap);
04.
05.
public
static
Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
06.
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
07.
bitmap.getHeight(), Config.ARGB_8888);
08.
Canvas canvas =
new
Canvas(output);
09.
10.
final
int
color =
0xff424242
;
11.
final
Paint paint =
new
Paint();
12.
final
Rect rect =
new
Rect(
0
,
0
, bitmap.getWidth(), bitmap.getHeight());
13.
final
RectF rectF =
new
RectF(rect);
14.
final
float
roundPx = bitmap.getWidth() /
2
;
15.
16.
paint.setAntiAlias(
true
);
17.
canvas.drawARGB(
0
,
0
,
0
,
0
);
18.
paint.setColor(color);
19.
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
20.
21.
paint.setXfermode(
new
PorterDuffXfermode(Mode.SRC_IN));
22.
canvas.drawBitmap(bitmap, rect, rect, paint);
23.
return
output;
24.
}
六十八、TextView高级应用
1. 自定义字体
可以使用setTypeface(Typeface)方法来设置文本框内文本的字体,而android的 Typeface又使用TTF字体文件来设置字体
所以,我们可以在程序中放入TTF字体文件,在程序中使用Typeface来设置字体:第一步,在assets目录下新建fonts目录,把TTF字体文件放到这里。第二步,程序中调用:
TextViewtv = (TextView)findViewById(R.id.textView);
AssetManagermgr=getAssets();//得到AssetManager
Typefacetf=Typeface.createFromAsset(mgr, "fonts/mini.TTF");//根据路径得到Typeface
tv.setTypeface(tf);//设置字体
效果如下图所示:
2. 显示多种颜色的字
Android支持html格式的字符串,通过调用Html.fromHtml(str)方法可以转换html格式的字符串str。
示例如下:
StringtextStr1 = "<font color="#ffff00">如果有一天,</font><br>";
StringtextStr2 = "<font color="#00ff00">我厌倦了这里,</font><br>";
StringtextStr3 = "<font color="#ff00ff">我会乘着梦,</font><br>";
StringtextStr4 = "<font color="#00ffff">飞向那个属于自己的<br>世界……</font><br>";
tv.setText(Html.fromHtml(textStr1+textStr2+textStr3+textStr4));
运行后效果如下:
3. 字体加粗
在xml布局文件中使用android:textStyle=”bold”可以将英文设置成粗体,但是不能将中文设置成粗体,将中文设置成粗体的方法是:使用TextPaint的仿“粗体”设置setFakeBoldText为true。示例代码如下:
tv.getPaint().setFakeBoldText(true);
效果如下:
4. 添加阴影
在xml布局文件中使用一系列android:shadowXXX属性可添加设置阴影。具体为:shadowColor设置阴影颜色;shadowDx设置阴影水平偏移量;shadowDy设置阴影垂直偏移量;shadowRadius设置阴影半径。
示例代码:
android:shadowColor="#ffffff"
android:shadowDx="15.0"
android:shadowDy="5.0"
android:shadowRadius="2.5"
显示效果如下:
5. 插入图片
插入图片有两种方法,第一种方法就是用上面说的html格式的字符串,不过转换稍微有些麻烦。需要用到ImageGetter类来对图片的src属性进行转换。示例代码如下:
StringimgStr = "<img src=""+R.drawable.sidai+""/>";
Html.ImageGetterimageGetter = new Html.ImageGetter() {
public Drawable getDrawable(Stringarg0) {
// TODO Auto-generated methodstub
int id =Integer.parseInt(arg0);
Drawable draw =getResources().getDrawable(id);
draw.setBounds(10, 10, 228,300);
return draw;
}
};
tv.append(Html.fromHtml(imgStr,imageGetter,null));
第二种方法是使用xml布局文件中一系列android:drawableXXX属性来实现插入图片。具体为:drawableBottom是在文本框内文本的底端绘制指定图像;drawableLeft是在文本框内文本的左边绘制指定图像;drawableRight是在文本框内文本的右边绘制指定图像;drawableTop是在文本框内文本的顶端绘制指定图像;drawablePadding设置文本框内文本与图像之间的间距。示例代码:
android:drawableBottom=”@drawable/sidai”
插入图片后的显示效果如下:
六十九、资源plurals表示数量的各种方式,
比如:一个教室有多少学生。考虑下面的例子:
there is 1 student;
there are 2 students;
there are 50 students;
显然对于2,50句子格式是一样的,对于1不同,Android支持将这种变体表示为plurals资源。
01.
<pre name=
"code"
class
=
"html"
> <?xml version=
"1.0"
encoding=
"utf-8"
?>
02.
<resources>
03.
<string name=
"hello"
>Hello World, Resource_Plurals!</string>
04.
<string name=
"app_name"
>Resource_Plurals</string>
05.
<plurals name=
"student"
>
06.
<item quantity=
"one"
>There is
1
student</item>
07.
<item quantity=
"other"
>There are %d students</item>
08.
</plurals>
09.
</resources>
1.
在Java代码中获取定义的plurals资源
01.
public
class
Resource_Plurals
extends
Activity {
02.
/** Called when the activity is first created. */
03.
@Override
04.
public
void
onCreate(Bundle savedInstanceState) {
05.
super
.onCreate(savedInstanceState);
06.
setContentView(R.layout.main);
07.
08.
Resources r = getResources();
09.
String s1 = r.getQuantityString(R.plurals.student,
1
,
1
);
10.
Log.i(
"plurals"
, s1);
11.
String s2 = r.getQuantityString(R.plurals.student,
2
,
2
);
12.
Log.i(
"plurals"
, s2);
13.
String s3 = r.getQuantityString(R.plurals.student,
50
,
50
);
14.
Log.i(
"plurals"
, s3);
15.
16.
}
17.
}
七十、Android 自定义json解析类
001.
import
java.lang.reflect.Method;
002.
import
java.util.Collection;
003.
import
java.util.Map;
004.
import
java.util.Set;
005.
public
final
class
JsonUtil{
006.
/**
007.
* 把对象封装为JSON格式
008.
*
009.
* @param o
010.
* 对象
011.
* @return JSON格式
012.
*/
013.
@SuppressWarnings
(
"unchecked"
)
014.
public
static
String toJson(
final
Object o){
015.
if
(o ==
null
){
016.
return
"null"
;
017.
}
018.
if
(o
instanceof
String)
//String{
019.
return
string2Json((String) o);
020.
}
021.
if
(o
instanceof
Boolean)
//Boolean{
022.
return
boolean2Json((Boolean) o);
023.
}
024.
if
(o
instanceof
Number)
//Number{
025.
return
number2Json((Number) o);
026.
}
027.
if
(o
instanceof
Map)
//Map{
028.
return
map2Json((Map<String, Object>) o);
029.
}
030.
if
(o
instanceof
Collection)
//List Set{
031.
return
collection2Json((Collection) o);
032.
}
033.
if
(o
instanceof
Object[])
//对象数组{
034.
return
array2Json((Object[]) o);
035.
}
036.
if
(o
instanceof
int
[])
//基本类型数组
037.
{
038.
return
intArray2Json((
int
[]) o);
039.
}
040.
if
(o
instanceof
boolean
[])
//基本类型数组
041.
{
042.
return
booleanArray2Json((
boolean
[]) o);
043.
}
044.
if
(o
instanceof
long
[])
//基本类型数组
045.
{
046.
return
longArray2Json((
long
[]) o);
047.
}
048.
if
(o
instanceof
float
[])
//基本类型数组
049.
{
050.
return
floatArray2Json((
float
[]) o);
051.
}
052.
if
(o
instanceof
double
[])
//基本类型数组
053.
{
054.
return
doubleArray2Json((
double
[]) o);
055.
}
056.
if
(o
instanceof
short
[])
//基本类型数组
057.
{
058.
return
shortArray2Json((
short
[]) o);
059.
}
060.
if
(o
instanceof
byte
[])
//基本类型数组
061.
{
062.
return
byteArray2Json((
byte
[]) o);
063.
}
064.
if
(o
instanceof
Object)
//保底收尾对象
065.
{
066.
return
object2Json(o);
067.
}
068.
throw
new
RuntimeException(
"不支持的类型: "
+ o.getClass().getName());
069.
}
070.
/**
071.
* 将 String 对象编码为 JSON格式,只需处理好特殊字符
072.
*
073.
* @param s
074.
* String 对象
075.
* @return JSON格式
076.
*/
077.
static
String string2Json(
final
String s)
078.
{
079.
final
StringBuilder sb =
new
StringBuilder(s.length() +
20
);
080.
sb.append(
'"'
);
081.
for
(
int
i =
0
; i < s.length(); i++)
082.
{
083.
final
char
c = s.charAt(i);
084.
switch
(c)
085.
{
086.
case
'"'
:
087.
sb.append(
"\""
);
088.
break
;
089.
case
'\'
:
090.
sb.append(
"\\"
);
091.
break
;
092.
case
'/'
:
093.
sb.append(
"\/"
);
094.
break
;
095.
case
''
:
096.
sb.append(
"\b"
);
097.
break
;
098.
case
' '
:
099.
sb.append(
"\f"
);
100.
break
;
101.
case
'
102.
':
103.
sb.append(
"\n"
);
104.
break
;
105.
case
'
106.
':
107.
sb.append(
"\r"
);
108.
break
;
109.
case
' '
:
110.
sb.append(
"\t"
);
111.
break
;
112.
default
:
113.
sb.append(c);
114.
}
115.
}
116.
sb.append(
'"'
);
117.
return
sb.toString();
118.
}
119.
/**
120.
* 将 Number 表示为 JSON格式
121.
*
122.
* @param number
123.
* Number
124.
* @return JSON格式
125.
*/
126.
static
String number2Json(
final
Number number)
127.
{
128.
return
number.toString();
129.
}
130.
/**
131.
* 将 Boolean 表示为 JSON格式
132.
*
133.
* @param bool
134.
* Boolean
135.
* @return JSON格式
136.
*/
137.
static
String boolean2Json(
final
Boolean bool)
138.
{
139.
return
bool.toString();
140.
}
141.
/**
142.
* 将 Collection 编码为 JSON 格式 (List,Set)
143.
*
144.
* @param c
145.
* @return
146.
*/
147.
static
String collection2Json(
final
Collection<Object> c)
148.
{
149.
final
Object[] arrObj = c.toArray();
150.
return
toJson(arrObj);
151.
}
152.
/**
153.
* 将 Map<String, Object> 编码为 JSON 格式
154.
*
155.
* @param map
156.
* @return
157.
*/
158.
static
String map2Json(
final
Map<String, Object> map)
159.
{
160.
if
(map.isEmpty())
161.
{
162.
return
"{}"
;
163.
}
164.
final
StringBuilder sb =
new
StringBuilder(map.size() <<
4
);
//4次方
165.
sb.append(
'{'
);
166.
final
Set<String> keys = map.keySet();
167.
for
(
final
String key : keys)
168.
{
169.
final
Object value = map.get(key);
170.
sb.append(
'"'
);
171.
sb.append(key);
//不能包含特殊字符
172.
sb.append(
'"'
);
173.
sb.append(
':'
);
174.
sb.append(toJson(value));
//循环引用的对象会引发无限递归
175.
sb.append(
','
);
176.
}
177.
// 将最后的 ',' 变为 '}':
178.
sb.setCharAt(sb.length() -
1
,
'}'
);
179.
return
sb.toString();
180.
}
181.
/**
182.
* 将数组编码为 JSON 格式
183.
*
184.
* @param array
185.
* 数组
186.
* @return JSON 格式
187.
*/
188.
static
String array2Json(
final
Object[] array)
189.
{
190.
if
(array.length ==
0
)
191.
{
192.
return
"[]"
;
193.
}
194.
final
StringBuilder sb =
new
StringBuilder(array.length <<
4
);
//4次方
195.
sb.append(
'['
);
196.
for
(
final
Object o : array)
197.
{
198.
sb.append(toJson(o));
199.
sb.append(
','
);
200.
}
201.
202.
// 将最后添加的 ',' 变为 ']':
203.
sb.setCharAt(sb.length() -
1
,
']'
);
204.
return
sb.toString();
205.
}
206.
static
String intArray2Json(
final
int
[] array)
207.
{
208.
if
(array.length ==
0
)
209.
{
210.
return
"[]"
;
211.
}
212.
final
StringBuilder sb =
new
StringBuilder(array.length <<
4
);
213.
sb.append(
'['
);
214.
for
(
final
int
o : array)
215.
{
216.
sb.append(Integer.toString(o));
217.
sb.append(
','
);
218.
}
219.
// set last ',' to ']':
220.
sb.setCharAt(sb.length() -
1
,
']'
);
221.
return
sb.toString();
222.
}
223.
static
String longArray2Json(
final
long
[] array)
224.
{
225.
if
(array.length ==
0
)
226.
{
227.
return
"[]"
;
228.
}
229.
final
StringBuilder sb =
new
StringBuilder(array.length <<
4
);
230.
sb.append(
'['
);
231.
for
(
final
long
o : array)
232.
{
233.
sb.append(Long.toString(o));
234.
sb.append(
','
);
235.
}
236.
// set last ',' to ']':
237.
sb.setCharAt(sb.length() -
1
,
']'
);
238.
return
sb.toString();
239.
}
240.
static
String booleanArray2Json(
final
boolean
[] array)
241.
{
242.
if
(array.length ==
0
)
243.
{
244.
return
"[]"
;
245.
}
246.
final
StringBuilder sb =
new
StringBuilder(array.length <<
4
);
247.
sb.append(
'['
);
248.
for
(
final
boolean
o : array)
249.
{
250.
sb.append(Boolean.toString(o));
251.
sb.append(
','
);
252.
}
253.
// set last ',' to ']':
254.
sb.setCharAt(sb.length() -
1
,
']'
);
255.
return
sb.toString();
256.
}
257.
static
String floatArray2Json(
final
float
[] array)
258.
{
259.
if
(array.length ==
0
)
260.
{
261.
return
"[]"
;
262.
}
263.
final
StringBuilder sb =
new
StringBuilder(array.length <<
4
);
264.
sb.append(
'['
);
265.
for
(
final
float
o : array)
266.
{
267.
sb.append(Float.toString(o));
268.
sb.append(
','
);
269.
}
270.
// set last ',' to ']':
271.
sb.setCharAt(sb.length() -
1
,
']'
);
272.
return
sb.toString();
273.
}
274.
static
String doubleArray2Json(
final
double
[] array)
275.
{
276.
if
(array.length ==
0
)
277.
{
278.
return
"[]"
;
279.
}
280.
final
StringBuilder sb =
new
StringBuilder(array.length <<
4
);
281.
sb.append(
'['
);
282.
for
(
final
double
o : array)
283.
{
284.
sb.append(Double.toString(o));
285.
sb.append(
','
);
286.
}
287.
// set last ',' to ']':
288.
sb.setCharAt(sb.length() -
1
,
']'
);
289.
return
sb.toString();
290.
}
291.
static
String shortArray2Json(
final
short
[] array)
292.
{
293.
if
(array.length ==
0
)
294.
{
295.
return
"[]"
;
296.
}
297.
final
StringBuilder sb =
new
StringBuilder(array.length <<
4
);
298.
sb.append(
'['
);
299.
for
(
final
short
o : array)
300.
{
301.
sb.append(Short.toString(o));
302.
sb.append(
','
);
303.
}
304.
// set last ',' to ']':
305.
sb.setCharAt(sb.length() -
1
,
']'
);
306.
return
sb.toString();
307.
}
308.
static
String byteArray2Json(
final
byte
[] array)
309.
{
310.
if
(array.length ==
0
)
311.
{
312.
return
"[]"
;
313.
}
314.
final
StringBuilder sb =
new
StringBuilder(array.length <<
4
);
315.
sb.append(
'['
);
316.
for
(
final
byte
o : array)
317.
{
318.
sb.append(Byte.toString(o));
319.
sb.append(
','
);
320.
}
321.
// set last ',' to ']':
322.
sb.setCharAt(sb.length() -
1
,
']'
);
323.
return
sb.toString();
324.
}
325.
public
static
String object2Json(
final
Object bean)
326.
{
327.
//数据检查
328.
if
(bean ==
null
)
329.
{
330.
return
"{}"
;
331.
}
332.
final
Method[] methods = bean.getClass().getMethods();
//方法数组
333.
final
StringBuilder sb =
new
StringBuilder(methods.length <<
4
);
//4次方
334.
sb.append(
'{'
);
335.
for
(
final
Method method : methods)
336.
{
337.
try
338.
{
339.
final
String name = method.getName();
340.
String key =
""
;
341.
if
(name.startsWith(
"get"
))
342.
{
343.
key = name.substring(
3
);
344.
//防死循环
345.
final
String[] arrs =
346.
{
"Class"
};
347.
boolean
bl =
false
;
348.
for
(
final
String s : arrs)
349.
{
350.
if
(s.equals(key))
351.
{
352.
bl =
true
;
353.
continue
;
354.
}
355.
}
356.
if
(bl)
357.
{
358.
continue
;
//防死循环
359.
}
360.
}
361.
else
if
(name.startsWith(
"is"
))
362.
{
363.
key = name.substring(
2
);
364.
}
365.
if
(key.length() >
0
&& Character.isUpperCase(key.charAt(
0
)) && method.getParameterTypes().length ==
0
)
366.
{
367.
if
(key.length() ==
1
)
368.
{
369.
key = key.toLowerCase();
370.
}
371.
else
if
(!Character.isUpperCase(key.charAt(
1
)))
372.
{
373.
key = key.substring(
0
,
1
).toLowerCase() + key.substring(
1
);
374.
}
375.
final
Object elementObj = method.invoke(bean);
376.
//System.out.println("###" + key + ":" + elementObj.toString());
377.
sb.append(
'"'
);
378.
sb.append(key);
//不能包含特殊字符
379.
sb.append(
'"'
);
380.
sb.append(
':'
);
381.
sb.append(toJson(elementObj));
//循环引用的对象会引发无限递归
382.
sb.append(
','
);
383.
}
384.
}
385.
catch
(
final
Exception e)
386.
{
387.
//e.getMessage();
388.
throw
new
RuntimeException(
"在将bean封装成JSON格式时异常:"
+ e.getMessage(), e);
389.
}
390.
}
391.
if
(sb.length() ==
1
)
392.
{
393.
return
bean.toString();
394.
}
395.
else
396.
{
397.
sb.setCharAt(sb.length() -
1
,
'}'
);
398.
return
sb.toString();}
399.
}
400.
private
JsonUtil(){
401.
}
402.
}
七十一、android自动跳转
有些时候需要类似这样的功能,在一个页面停留2秒后,跳转到另外一个页面!
第一种方法:
01.
Timer timer =
new
Timer();
02.
03.
TimerTask timerTask =
new
TimerTask() {
04.
05.
@Override
06.
public
void
run() {
07.
// 你要干的活
08.
09.
}
10.
};
11.
timer.schedule(timerTask,
1000
*
2
);
//2秒后执行
在run()方法里面写上你的跳转就可以了。
第二种方法:
01.
private
final
int
SPLASH_DISPLAY_LENGHT =
2000
;
02.
03.
@Override
04.
public
void
onCreate(Bundle savedInstanceState) {
05.
super
.onCreate(savedInstanceState);
06.
this
.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
07.
WindowManager.LayoutParams.FLAG_FULLSCREEN);
08.
setContentView(R.layout.splash);
09.
new
Handler().postDelayed(
new
Runnable() {
10.
@Override
11.
public
void
run() {
12.
Intent intent =
new
Intent(Splash.
this
, XXX.
class
);
13.
Splash.
this
.startActivity(intent);
14.
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
15.
Splash.
this
.finish();
16.
}
17.
18.
}, SPLASH_DISPLAY_LENGHT);
19.
}
七十二、Gally选中高亮状态
没有选中,在GalleryActivity中,设置gallery.setUnselectedAlpha(0.3f); 透明度为0.3 选中,在ImageAdapter的getView(int position, View convertView, ViewGroup parent)中,设置imageview.setBackgroundColor(Color.alpha(1)); 背景色为1
七十三、TextView颜色设置
1.
android:textColor
//设置文本颜色
2.
3.
android:textColorHighlight
//被选中文字的底色,默认为蓝色
4.
5.
android:textColorHint
//设置提示信息文字的颜色,默认为灰色。与hint一起使用。
七十四、Button使用Shape
01.
<?xml version=
"1.0"
encoding=
"utf-8"
?>
02.
<selector
03.
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
04.
<item android:state_pressed=
"true"
>
05.
<shape>
06.
<gradient
07.
android:startColor=
"#ff8c00"
08.
android:endColor=
"#FFFFFF"
09.
android:angle=
"270"
/>
10.
<stroke
11.
android:width=
"2dp"
12.
android:color=
"#dcdcdc"
/>
13.
<corners
14.
android:radius=
"2dp"
/>
15.
<padding
16.
android:left=
"10dp"
17.
android:top=
"10dp"
18.
android:right=
"10dp"
19.
android:bottom=
"10dp"
/>
20.
</shape>
21.
</item> <item android:state_focused=
"true"
>
22.
<shape>
23.
<gradient
24.
android:startColor=
"#ffc2b7"
25.
android:endColor=
"#ffc2b7"
26.
android:angle=
"270"
/>
27.
<stroke
28.
android:width=
"2dp"
29.
android:color=
"#dcdcdc"
/>
30.
<corners
31.
android:radius=
"2dp"
/>
32.
<padding
33.
android:left=
"10dp"
34.
android:top=
"10dp"
35.
android:right=
"10dp"
36.
android:bottom=
"10dp"
/>
37.
</shape>
38.
</item> <item>
39.
<shape>
40.
<gradient
41.
android:startColor=
"#ff9d77"
42.
android:endColor=
"#ff9d77"
43.
android:angle=
"270"
/>
44.
<stroke
45.
android:width=
"2dp"
46.
android:color=
"#fad3cf"
/>
47.
<corners
48.
android:radius=
"2dp"
/>
49.
<padding
50.
android:left=
"10dp"
51.
android:top=
"10dp"
52.
android:right=
"10dp"
53.
android:bottom=
"10dp"
/>
54.
</shape>
55.
</item>
56.
</selector>
七十五、Android Drawable叠加处理方法
大家可能知道Bitmap的叠加处理在Android平台中可以通过Canvas一层一层的画就行了,而Drawable中如何处理呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,今天Android123给大家说下好用简单的LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简单的代码表示:
1.
Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.cwj);
2.
Drawable[] array =
new
Drawable[
3
]; array[
0
] =
new
PaintDrawable(Color.BLACK);
//黑色
3.
array[
1
] =
new
PaintDrawable(Color.WHITE);
//白色
4.
array[
2
] =
new
BitmapDrawable(bm);
//位图资源
5.
LayerDrawable ld =
new
LayerDrawable(array);
//参数为上面的Drawable数组
6.
ld.setLayerInset(
1
,
1
,
1
,
1
,
1
);
//第一个参数1代表数组的第二个元素,为白色
7.
ld.setLayerInset(
2
,
2
,
2
,
2
,
2
);
//第一个参数2代表数组的第三个元素,为位图资源
8.
mImageView.setImageDrawable(ld);
上面的方法中LayerDrawable是关键,Android开发网提示setLayerInset方法原型为public void setLayerInset (int index, int l, int t, int r, int b) 其中第一个参数为层的索引号,后面的四个参数分别为left、top、right和bottom。对于简单的图片合成我们可以将第一和第二层的PaintDrawable换成BitmapDrawable即可实现简单的图片合成。
七十六、Android发信息时观察者
发信息大致的流程是:
观察者,ContentObserver
观察信息变化,它只能观察所有 就是 :Uri:content://sms/
你点击了发送按钮后,状态还是正在发送,这时这条信息已在你不注意时插入到发件箱中(调用 onChange一次,你可以查一下outbox的内容),当发送成功后(就会打发件箱的临时信息删除 又调用一次 onChange),成功后插入到已发信息sent(这是又会调用 onChange),它会调用三次,所以你们在观察发送信息时会出现onChange出现三次,这个解决方案我暂时只想到两种方案:
01.
1
:就是在contetnobserver类里定义一个变量
int
count=
0
;
02.
03.
@Override
04.
05.
public
void
onChange(
boolean
selfChange) {
06.
07.
count++;
08.
09.
//调用第三次才是已发信息
10.
11.
if
(count==
3
){
12.
13.
//代表发送了一条信息
14.
15.
Log.i(
"wet"
,
"发送了一条信息"
);
16.
17.
count=
0
;
//以便第下次用
18.
19.
}
20.
21.
22.
23.
2
:还有一个是:
24.
25.
记录 context.getContentResolver().query(Uri.parse(
"content://sms/sent"
),
null
,
null
,
null
,
null
);
26.
27.
首先记录它上次的条数
28.
29.
然后再记录它这次的条数,如果改变了,那就代表它改变了
七十七、Android屏幕解锁和点亮屏幕
最近在做一个闹钟的项目,当闹钟响起的时候需要用到自动解锁和点亮屏幕,因此记录一下解屏幕锁与点亮屏幕的代码:
01.
KeyguardManager km= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
//得到键盘锁管理器对象
02.
KeyguardLock kl = km.newKeyguardLock(
"unLock"
);
//参数是LogCat里用的Tag
03.
04.
kl.disableKeyguard();
//解锁
05.
06.
PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);
//获取电源管理器对象
07.
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK,
"bright"
);
08.
//获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag
09.
wl.acquire();
//点亮屏幕
10.
wl.release();
//释放
11.
12.
要实现自动解锁和点亮屏幕的功能则需要在AndroidManifest.xml添加权限:
13.
14.
<uses-permission android:name=
"android.permission.WAKE_LOCK"
/>
15.
<uses-permission android:name=
"android.permission.DISABLE_KEYGUARD"
/>
七十八、去掉listView中间隔断线
1.
方法
1
:listView.setDividerHeight(
0
);
2.
方法
2
:
this
.getListView().setDivider(
null
);
3.
方法
3
:android:divider=
"@null"
4.
5.
android:cacheColorHint=
"#00000000"
设置其为透明!! 默认为黑色!!!!!
七十九、仿iphone的icon的效果
001.
public
static
Bitmap toRoundCorner(Bitmap bitmap,
int
pixels)
002.
{
003.
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
004.
Canvas canvas =
new
Canvas(output);
005.
006.
final
int
color =
0xff424242
;
007.
final
Paint paint =
new
Paint();
008.
final
Rect rect =
new
Rect(
0
,
0
, bitmap.getWidth(), bitmap.getHeight());
009.
final
RectF rectF =
new
RectF(rect);
010.
final
float
roundPx = pixels;
011.
012.
paint.setAntiAlias(
true
);
013.
canvas.drawARGB(
0
,
0
,
0
,
0
);
014.
paint.setColor(color);
015.
canvas.drawRoundRect(rectF, roundPx, roundPx, paint)
016.
<script type=
"text/javascript"
>
017.
<!--
018.
$(function(){
019.
$(
'#ArticleBox img'
).LoadImage(
true
,
560
,
560
,
'http://www.it165.net/statics/images/s_nopic.gif'
);
020.
})
021.
//-->
022.
</script>
023.
024.
<div
class
=
"aboutlbox"
>
025.
<h3>延伸阅读:</h3>
026.
<ul>
027.
<li>
1
、<a href=
"http://www.it165.net/pro/html/201109/741.html"
>Android常用控件的信息</a></li>
028.
<li>
2
、<a href=
"http://www.it165.net/pro/html/201111/1156.html"
>从零开始学Android之常用控件</a></li>
029.
<li>
3
、<a href=
"http://www.it165.net/pro/html/201207/3096.html"
>Android常用组件之RadoiButton</a></li>
030.
<li>
4
、<a href=
"http://www.it165.net/pro/html/201404/11674.html"
>Android系统层常用类介绍</a></li>
031.
<li>
5
、<a href=
"http://www.it165.net/pro/html/201404/12386.html"
>Android常用的电话操作</a></li>
032.
<li>
6
、<a href=
"http://www.it165.net/pro/html/201405/13441.html"
>Android中常用的工具类
02
</a></li>
033.
<li>
7
、<a href=
"http://www.it165.net/pro/html/201405/13444.html"
>android常用正则工具类</a></li>
034.
<li>
8
、<a href=
"http://www.it165.net/pro/html/201405/13458.html"
>Android中常用的工具类
01
</a></li>
035.
</ul>
036.
</div>
037.
<div
class
=
"callback pa10"
>
038.
<div id=
"backindexs"
>
039.
<h3><a href=
"http://www.it165.net/"
>返回到首页</a></h3>
040.
<h3><a href=
"http://www.it165.net/pro/"
>返回到编程大巴</a></h3>
041.
</div>
042.
</div>
043.
<div
class
=
"Upbox pa10"
>
044.
<ul
class
=
"WPBul"
>
045.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/Win32/index.html"
title=
"Win32"
><img alt=
"Win32"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505102215623.jpg"
width=
"90"
height=
"60"
></a></li>
046.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/Win32/index.html"
title=
"Win32"
>Win32</a></li>
047.
</ul>
048.
<ul
class
=
"WPBul"
>
049.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/OpenGL/index.html"
title=
"OpenGL"
><img alt=
"OpenGL"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505102149168.jpg"
width=
"90"
height=
"60"
></a></li>
050.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/OpenGL/index.html"
title=
"OpenGL"
>OpenGL</a></li>
051.
</ul>
052.
<ul
class
=
"WPBul"
>
053.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/MVC/index.html"
title=
"ASP.NET MVC"
><img alt=
"ASP.NET MVC"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505102124182.jpg"
width=
"90"
height=
"60"
></a></li>
054.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/MVC/index.html"
title=
"ASP.NET MVC"
>ASP.NET MVC</a></li>
055.
</ul>
056.
<ul
class
=
"WPBul"
>
057.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/cocos2d-x/index.html"
title=
"cocos2d-x"
><img alt=
"cocos2d-x"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505102055110.jpg"
width=
"90"
height=
"60"
></a></li>
058.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/cocos2d-x/index.html"
title=
"cocos2d-x"
>cocos2d-x</a></li>
059.
</ul>
060.
<ul
class
=
"WPBul"
>
061.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/WCF/index.html"
title=
"WCF"
><img alt=
"WCF"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505102027533.jpg"
width=
"90"
height=
"60"
></a></li>
062.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/WCF/index.html"
title=
"WCF"
>WCF</a></li>
063.
</ul>
064.
<ul
class
=
"WPBul"
>
065.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/Linq/index.html"
title=
"Linq"
><img alt=
"Linq"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505101959536.jpg"
width=
"90"
height=
"60"
></a></li>
066.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/Linq/index.html"
title=
"Linq"
>Linq</a></li>
067.
</ul>
068.
<ul
class
=
"WPBul"
>
069.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/Android/index.html"
title=
"Android"
><img alt=
"Android"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505101919704.jpg"
width=
"90"
height=
"60"
></a></li>
070.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/Android/index.html"
title=
"Android"
>Android</a></li>
071.
</ul>
072.
<ul
class
=
"WPBul"
>
073.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/QT/index.html"
title=
"QT"
><img alt=
"QT"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505101848333.jpg"
width=
"90"
height=
"60"
></a></li>
074.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/QT/index.html"
title=
"QT"
>QT</a></li>
075.
</ul>
076.
<ul
class
=
"WPBul"
>
077.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/MFC/index.html"
title=
"MFC"
><img alt=
"MFC"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505101817843.jpg"
width=
"90"
height=
"60"
></a></li>
078.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/MFC/index.html"
title=
"MFC"
>MFC</a></li>
079.
</ul>
080.
<ul
class
=
"WPBul"
>
081.
<li
class
=
"pic"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/JQuery/index.html"
title=
"JQuery"
><img alt=
"JQuery"
src=
"http://www.it165.net/uploadfile/2013/0505/20130505101746875.jpg"
width=
"90"
height=
"60"
></a></li>
082.
<li
class
=
"ptext"
><a target=
"_blank"
href=
"http://www.it165.net/pro/ActiveX/JQuery/index.html"
title=
"JQuery"
>JQuery</a></li>
083.
</ul>
084.
</div>
085.
<div
class
=
"ArtLine"
></div>
086.
<div
class
=
"callback"
style=
"padding:10px 20px 10px 20px"
>
087.
<!--兼容版,可保证页面完全兼容-->
088.
<div id=
"SOHUCS"
sid=
"38370"
><iframe src=
"http://changyan.itc.cn/v2.5/v20151225108/src/innerpage.html?baseUri=http://changyan.itc.cn/v2.5/v20151225108/&version=20151225108"
frameborder=
"no"
style=
"width: 100%; border: 0px;"
></iframe></div>
089.
<script>
090.
(function(){
091.
var appid =
'cyrljYvoL'
,
092.
conf =
'prod_2c3485f27b3b0d5d138546ad112483d2'
;
093.
var doc = document,
094.
s = doc.createElement(
'script'
),
095.
h = doc.getElementsByTagName(
'head'
)[
0
] || doc.head || doc.documentElement;
096.
s.type =
'text/javascript'
;
097.
s.charset =
'utf-8'
;
098.
s.src =
'http://assets.changyan.sohu.com/upload/changyan.js?conf='
+ conf +
'&appid='
+ appid;
099.
h.insertBefore(s,h.firstChild);
100.
})()
101.
</script>
102.
</div>
103.