小总结之Android知识点(1)

1:
     /**
     * 禁止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});
    }
2:比如这里限制30个字节,我们知道中文2个字节,英文1个字节,所以这里需要用到正则表达式规则来限制这个个数string.replaceAll("[^\\x00-\\xff]", "**").length()来表示,之后就是Editable的用法了,以及如何使用光标了。条件:1:两边的空格不考虑进来2:中间的空格考虑
            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});
3:JSON解析获取不确定Key值时需要用到map,把Json字符串按键-值对的形式进行获取
/** 
* 从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; 
    } 
4:Java中Arrays的asList()方法 可以将 数组转为List 但是,这个数组类型必须是 引用类型的JSONObject 判断字符串null还是null值(这个问题应该后台的同志注意的),比如解析:
 
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
5:getMeasuredHeight和getHeight区别

 getMeasuredHeight()返回的是控件原始测量高度,与屏幕无关,getHeight()返回的是在屏幕上显示的高度。这两个值如果控件大小不超过屏幕大小时值是相同的,超过屏幕大小时getMeasuredHeight()为控件的实际高度(超过屏幕大小了),

6:Android中 Bitmap和Drawable相互转换的方法
 
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;

                    }

          }

7.为什么不能再子线程中更新UI

首先你想在子线程中更新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)
Handler
Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行,不仅仅是android有这样的问题,几乎所有的编程领域都会涉及到这个问题:线程同步开销,有兴趣的童鞋可以再深入研究了

你可能感兴趣的:(android)