小まとめのAndroid知識ポイント(1)

7354 ワード

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解析で不確定キー値を取得するには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()は画面に表示される高さを返します.この2つの値は、コントロールのサイズが画面のサイズを超えない場合と同じであり、画面のサイズを超えた場合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.");
    }
}

解決方法は、一般的に次の4つの方法で使用されます.
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Handler

Android UI操作はスレッドが安全ではなく、これらの操作はUIスレッドで実行しなければならない.androidだけでなく、ほとんどのプログラミング分野でこの問題に関連している.スレッド同期オーバーヘッド、興味のある子供靴はさらに深く研究できる.