小まとめのAndroid知識ポイント(1)
7354 ワード
1:
2:例えば、ここでは30バイトを制限し、中国語2バイト、英語1バイトを知っているので、ここでは正規表現ルールを使ってこの個数stringを制限する必要があります.replaceAll("[^\\x00-\\xff]", "**").length()で表すと、その後はEditableの使い方と、カーソルの使い方がわかります.条件:1:両側のスペースは考慮しない2:中間のスペースは考慮しない
3:JSON解析で不確定キー値を取得するにはmapを用い,Json文字列キー-値ペアの形式で取得する.
4:JavaにおけるArraysのasList()メソッドは配列をListに変換することができるが、この配列タイプは参照タイプのJSOnObjectが文字列nullかnull値か(この問題はバックグラウンドの同志が注意すべき)を判断しなければならない.例えば、解析:
5:getMeasuredHeightとgetHeightの違い
getMeasuredHeight()は、画面に関係なくコントロールの元の測定高さを返し、getHeight()は画面に表示される高さを返します.この2つの値は、コントロールのサイズが画面のサイズを超えない場合と同じであり、画面のサイズを超えた場合getMeasuredHeight()はコントロールの実際の高さ(画面のサイズを超えた)であり、
6:AndroidでのBitmapとDrawableの相互変換方法
7.サブスレッドでUIを更新できない理由
まず、サブスレッドでUIを更新したい場合は、
なぜこの異常が発生したのでしょうか.この異常はどこで投げ出されたのですか?このコードはframework/base/core/java/android/view/ViewRootImplから出ています.java
解決方法は、一般的に次の4つの方法で使用されます.
Android UI操作はスレッドが安全ではなく、これらの操作はUIスレッドで実行しなければならない.androidだけでなく、ほとんどのプログラミング分野でこの問題に関連している.スレッド同期オーバーヘッド、興味のある子供靴はさらに深く研究できる.
/**
* 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だけでなく、ほとんどのプログラミング分野でこの問題に関連している.スレッド同期オーバーヘッド、興味のある子供靴はさらに深く研究できる.