/**
* 禁止EditText输入空格
* @param editText
*/
public static void setEditTextInhibitInputSpace(EditText editText){
InputFilter filter=new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if(source.equals(" ")return "";
else return null;
}
};
editText.setFilters(new InputFilter[]{filter});
}
private int selectionStart ;
private int selectionEnd ;
@Override
public void afterTextChanged(Editable s) {
switchHint(s);
selectionStart = real_name.getSelectionStart();
selectionEnd = real_name.getSelectionEnd();
real_name.removeTextChangedListener(this);//防止内存溢出,必须写。
while (s.toString().trim().replaceAll("[^\\x00-\\xff]", "**").length() > 30) {//循环到30个字节为止
s.delete(selectionStart - 1, selectionEnd);
selectionStart--;
selectionEnd--;
}
real_name.setText(s);//重新设置字符串
real_name.setSelection(selectionStart);//重新设置光标的位置
real_name.addTextChangedListener(this);//配合removeTextChangedListener
}
或者也可以使用下面方式:
//最大字节数
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend) {
int dindex = 0;
int count = 0;
while (count <= maxLen && dindex < dest.length()) {
char c = dest.charAt(dindex++);
if (c < 128) {
count = count + 1;
} else {
count = count + 2;
}
}
if (count > maxLen) {
return dest.subSequence(0, dindex - 1);
}
int sindex = 0;
while (count <= maxLen && sindex < src.length()) {
char c = src.charAt(sindex++);
if (c < 128) {
count = count + 1;
} else {
count = count + 2;
}
}
if (count > maxLen) {
showToast("最多输入20个字符");
sindex--;
}
return src.subSequence(0, sindex);
}
};
labelEt = (EditText) view.findViewById(R.id.labelEt);
labelEt.setFilters(new InputFilter[]{filter});
/**
* 从json HASH表达式中获取一个map,该map支持嵌套功能
* 形如:{"id" : "johncon", "name" : "小强"}
* 注意commons-collections版本,必须包含org.apache.commons.collections.map.MultiKeyMap
* @param object
* @return
*/
public static Map getMapFromJson(String jsonString) {
setDataFormat2JAVA();
JSONObject jsonObject = JSONObject.fromObject(jsonString);
Map map = new HashMap();
for(Iterator iter = jsonObject.keys(); iter.hasNext();){
String key = (String)iter.next();
map.put(key, jsonObject.get(key));
}
return map;
}
JSONObject jo = JSONObject.fromObject("{a:null,b:\"null\"}");
Object o = jo.get("a");
if(o instanceof String){
System.out.println("a is empty null");
}else{
System.out.println("a is String null");
}
o = jo.get("b");
if(o instanceof String){
System.out.println("b is empty null");
}else{
System.out.println("b is String null");
}
输出:a is empty null
b is String null
getMeasuredHeight()返回的是控件原始测量高度,与屏幕无关,getHeight()返回的是在屏幕上显示的高度。这两个值如果控件大小不超过屏幕大小时值是相同的,超过屏幕大小时getMeasuredHeight()为控件的实际高度(超过屏幕大小了),
1.Drawable—>Bitmap
Resources res=getResources();
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.sample_0);
Resources res=getResources();
private byte[] Bitmap2Bytes(Bitmap bm){
2.Bitmap---->Drawable
Drawable drawable =new BitmapDrawable(bmp);
3、Drawable → Bitmap
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
//canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
4、从资源中获取Bitmap
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
5、Bitmap → byte[]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray(); }
6、 byte[] → Bitmap
private Bitmap Bytes2Bimap(byte[] b){
if(b.length!=0){
return BitmapFactory.decodeByteArray(b, 0, b.length);
}
else {
return null;
}
}
首先你想在子线程中更新UI可能会报
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
为什么会出现这个异常呢?这个异常在哪里抛出来的呢?该代码出自 framework/base/core/java/android/view/ViewRootImpl.java
void checkThread() { if (mThread != Thread.currentThread()) { throw new CalledFromWrongThreadException( "Only the original thread that created a view hierarchy can touch its views."); } }
解决方式一般会用到以下四种方式:
Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) HandlerAndroid UI操作并不是线程安全的,并且这些操作必须在UI线程执行,不仅仅是android有这样的问题,几乎所有的编程领域都会涉及到这个问题:线程同步开销,有兴趣的童鞋可以再深入研究了