转: 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" 设置其为透明!! 默认为黑色!!!!!

)



7万+

被折叠的 条评论
为什么被折叠?



