Android開發(fā)
一、正則表達(dá)式
-
手機(jī)號(hào)
public static boolean isMobileNO(String mobiles) { Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\d])|(18[0-9]))\\d{8}$"); Matcher m = p.matcher(mobiles); return m.matches(); }
二繁涂、Java
-
Java 非靜態(tài)內(nèi)部類會(huì)默認(rèn)持有外部類的引用。
-
正則表達(dá)式轉(zhuǎn)義
matches 量愧、replaceAll柑土、replaceFirst慢哈、split等函數(shù)參數(shù)為正則表達(dá)式,匹配"."等需要轉(zhuǎn)義`"\\\."`观游。replace不支持正則搂捧。
-
StringBuffer 線程安全,效率低懂缕。Stringbuilder非多線程允跑,效率高。
-
泛型的限制
- 在使用 String.class List.class 不能使用泛型形式(List<?>.class 是錯(cuò)誤的)
- 在使用 instanceof 時(shí)候只能使用通配泛型(List<?>) (只能 o instanceof List<?>或者 o instanceof List 而不能 o instanceof List<String>)
- 不能創(chuàng)建泛型數(shù)組
-
Java printf(n%) 換行
-
枚舉避免使用ordinal
最好添加一個(gè) private final int order 變量搪柑,構(gòu)造函數(shù)中賦值聋丝,然后獲取順序。
-
EnumSet.of(...) 創(chuàng)建枚舉集合; new EnumMap<Enum,Object>(Enum.class)
-
Collections.unmodifiableXX() 創(chuàng)建不可改變的集合
-
java.lang.reflect Class.newInstance
-
對(duì)象傳給print工碾、字符串聯(lián)操作符(+)弱睦、assert、調(diào)試器打印 會(huì)自動(dòng)調(diào)用toString方法
-
Java沒(méi)有可變參數(shù)渊额,多個(gè)構(gòu)造函數(shù)時(shí)可以用 Builder 代替
-
Java 讀取long double 是非原子的
-
調(diào)用構(gòu)造函數(shù)
構(gòu)造函數(shù)的第一行 可以用 this(xx,....)等况木,調(diào)用本類其他的構(gòu)造函數(shù),super類似旬迹,也需要放在首行火惊,調(diào)用父類的構(gòu)造方法
-
后臺(tái)線程
Thread.setDeamon(true) 將線程變成后臺(tái)線程,進(jìn)程若只剩下后臺(tái)線程奔垦,這個(gè)進(jìn)程會(huì)結(jié)束屹耐。
-
獲取父類名字
Object類中的getClass()是final的,因此 super.getClass().getName()
仍然調(diào)用Object中的方法椿猎,獲取的還是子類的名字惶岭,獲取父類名字應(yīng)該用 getClass().getSuperClass().getName()
-
try return finally
- try中有return,finally在return中間運(yùn)行(在return之后寿弱,但不影響return結(jié)果)
try{
i = 1;
return i;
}finally{
i++;
}//結(jié)果 是 1
- try中有return,finally中也有return,finally中return值有效
try{
return 1;
}finally{
return 2;
}//結(jié)果 是 2
- try中有 System.exit(0);,Java虛擬機(jī)會(huì)直接退出,finally并不會(huì)執(zhí)行俗他。
- 總結(jié):finally比return和break后執(zhí)行且不影響return結(jié)果脖捻;如果finally中有return,會(huì)提前終止并以finally中return值返回兆衅。
-
synchronized 和 Lock
- Lock可以嘗試獲取鎖
lock.tryLock()
,也可以嘗試一段時(shí)間后放棄lock.tryLock(2,TimeUnit.SECONDS)
嗜浮。 - synchronized 不可以羡亩,但使用簡(jiǎn)單,更安全危融。
-
線程休眠
jdk5之后用 TimeUnit.SECONDS.sleep(1)
代替 Thread.sleep(1000)
-
用一個(gè)檢查感興趣條件的while循環(huán)包圍wait()
-
final 的 instant variable(實(shí)例變量) 沒(méi)有 default value
-
public class的名字必須和文件名相同
-
Java 中的Type
Type
它是所有類型的公共接口畏铆。包括原始類型、參數(shù)化類型吉殃、數(shù)組類型辞居、類型變量和基本類型。ParameterizedType, TypeVariable, WildcardType,GenericArrayType這四個(gè)接口都是它的子接口蛋勺。
GenericDeclaration
這個(gè)接口Class瓦灶、Method、Constructor都有實(shí)現(xiàn)抱完,我們就是要用這個(gè)接口的getTypeParameters方法贼陶,它返回一個(gè)TypeVariable[]數(shù)組,這個(gè)數(shù)組里面就是我們定義的類型變量T和K巧娱,順序與我們聲明時(shí)一樣碉怔。如果用循環(huán)語(yǔ)句將數(shù)組打印出來(lái),你會(huì)發(fā)現(xiàn)只會(huì)輸出T和K禁添,這可不是我們想要的結(jié)果撮胧,那么想要獲得預(yù)期的結(jié)果怎么辦呢?請(qǐng)繼續(xù)往下看老翘。
TypeVariable
它表示類型變量芹啥。比如T,比如K extends Comparable<? super T> & Serializable酪捡,這個(gè)接口里面有個(gè)getBounds()方法叁征,它用來(lái)獲得類型變量上限的Type數(shù)組,如果沒(méi)有定義上限逛薇,則默認(rèn)設(shè)定上限為Object捺疼,請(qǐng)注意TypeVariable是接口,實(shí)際得到的是TypeVariableImpl實(shí)現(xiàn)類永罚,下面幾個(gè)接口都一樣啤呼。
拿T和K來(lái)說(shuō)明卧秘,T沒(méi)有定義任何上限,所以它就有一個(gè)默認(rèn)上限java.lang.Object官扣,實(shí)際跟蹤代碼的時(shí)候你會(huì)發(fā)現(xiàn)T的bounds屬性為空翅敌,只有在調(diào)用了getBounds()方法后,才會(huì)有一個(gè)Type[1]數(shù)組[class java.lang.Object]惕蹄。而對(duì)于K來(lái)說(shuō)蚯涮,調(diào)用了getBounds方法后,得到的數(shù)組是[java.lang.Comparable<? super T>, interface java.io.Serializable]卖陵,它們的類型卻是不一樣的遭顶,第1個(gè)是ParameterizedType,而第二個(gè)是Class
ParameterizedType
ParameterizedType表示參數(shù)化類型泪蔫,就是上面說(shuō)的java.lang.Comparable<? super T>棒旗,再比如List<T>,List<String>撩荣,這些都叫參數(shù)化類型铣揉。得到Comparable<? super T>之后,再調(diào)用getRawType()與getActualTypeArguments()兩個(gè)方法餐曹,就可以得到聲明此參數(shù)化類型的類(java.lang.Comparable)和實(shí)際的類型參數(shù)數(shù)組([? super T])逛拱,而這個(gè)? super T又是一個(gè)WildcardType類型。
WildcardType
它用來(lái)描述通配符表達(dá)式凸主,上面返回的? super T正好是這個(gè)類型橘券。然后調(diào)用getUpperBounds()上限和getLowerBounds()下限這兩個(gè)方法,獲得類型變量?的限定類型(上下限)卿吐,對(duì)于本例的通配符(?)旁舰,它的上限為java.lang.Object,下限為T
通過(guò)上面幾個(gè)接口的分析嗡官,可以將Person類的泛型參數(shù)都解析出來(lái)箭窜,那么Person的超類以及實(shí)現(xiàn)的接口該怎么處理呢?Class類里面同樣在1.5版本加入了getGenericSuperclass()與getGenericInterfaces()兩個(gè)方法衍腥,用于返回帶參數(shù)化類型的超類與接口磺樱。
-
自增運(yùn)算符
int count = 0;
count = count++;
//count的值為0
-
在序列化類中,不要使用構(gòu)造函數(shù)為final變量賦值婆咸。
-
Integer.valueOf() -128~127是從對(duì)象池中取的竹捉。
-
接口中可以有實(shí)現(xiàn)
interface A{
void A();
}
interface B{
public static final A = new A(){
void A(){
System.out.println("Bingo!");
}
}
}
-
最好不要在構(gòu)造函數(shù)中聲明初始化其他類
-
String 常量池
String s = new String("哈哈哈")
//不會(huì)檢查、添加常量池
-
集合默認(rèn)申請(qǐng)長(zhǎng)度 10
為避免多次申請(qǐng)內(nèi)存尚骄,最好指定初始容量
-
反序列化時(shí)構(gòu)造函數(shù)不執(zhí)行
-
ArrayList是動(dòng)態(tài)數(shù)組块差;Vector是線程安全的動(dòng)態(tài)數(shù)組
-
子列表是原始列表的視圖
List list = new ArrayList<Object>(100);
list.subList(20,30).clear;// 刪除list中20~30位置的元素
subList返回list的視圖后,不能對(duì)list再進(jìn)行修改,會(huì)報(bào)ConcurrentModificationException憨闰∽次希可以用Collections.unmodifiableList 保護(hù)原list
-
垃圾回收
(一)對(duì)象是否“已死”
- 引用計(jì)數(shù)
- 可達(dá)性
(二)垃圾收集算法
- 標(biāo)記-清楚
- 復(fù)制
- 標(biāo)記-整理
-
單例
除枚舉單例外,其他五種單例模式都可以以反序列化的方式重新生成對(duì)象鹉动。要重新方法
private Object readResolve(){
return instance;
}
-
Builder模式的優(yōu)點(diǎn)
- 避免要構(gòu)造的對(duì)象暴露過(guò)多不相關(guān)接口
- 可以保持一致性(某些屬性建立后不能隨意修改轧坎,將配置分離)
-
Cloneable實(shí)現(xiàn)拷貝時(shí),構(gòu)造函數(shù)不會(huì)執(zhí)行泽示。(clone 是內(nèi)存中二進(jìn)制流的拷貝)
-
不能將除了null之外的任何元素放到Collection<?>中
三缸血、Android
-
EditText輸入法
EditText 啟動(dòng)獲得焦點(diǎn)會(huì)彈出
輸入法取消辦法:在AndroidManifest.xml中對(duì)應(yīng)的anctivity中添加 android:windowSoftInputMode="stateHidden",F(xiàn)ragment同樣適用械筛。但是這種方法會(huì)導(dǎo)致快速點(diǎn)擊控件時(shí)属百,出現(xiàn)輸入法閃動(dòng)問(wèn)題。 edit.setInputType(InputType.TYPE_NULL)則不會(huì);
-
ListView setSelection 選中并移動(dòng)到
ListView中setSelection变姨,因?yàn)槭悄阕约河|發(fā)的select事件,你自己肯定知道厌丑,它默認(rèn)認(rèn)為沒(méi)有必要通知定欧,因此不觸發(fā)事件,也不通知監(jiān)聽器怒竿。只是刷新選中位置砍鸠,并滾動(dòng)界面,請(qǐng)求重新布局耕驰。
很多操作需要等待某個(gè)UI組件加載完才能執(zhí)行爷辱,可以用post(Runnable)來(lái)實(shí)現(xiàn)。在listView加載完成后執(zhí)行操作朦肘。
例:
listView.post(new Runnable() {
public void run() {
//執(zhí)行操作
listView.setSelection(i);
}
});
-
Padding與margin的區(qū)別饭弓。
Padding控制本控件內(nèi)子控件的距離。Margin控制本控件在母控件的距離媒抠。
-
"<"符號(hào) 可以用
"<"
來(lái)實(shí)現(xiàn)弟断; "&" 用"&"
。
-
鍵盤彈出壓擠屏幕控件
AndroidManifest.xml 文件中界面對(duì)應(yīng)的 < activity> 里加入
android:windowSoftInputMode="adjustPan" 鍵盤就會(huì)覆蓋屏幕 android:windowSoftInputMode="stateVisible|adjustResize" 屏幕整體上移
-
Edittext獲取焦點(diǎn)隱藏顯示輸入法趴生、鍵盤
private void setViewFocus(View v) { v.setFocusable(true); v.setFocusableInTouchMode(true); v.requestFocus(); v.requestFocusFromTouch(); } private void openInput(Context context, View editText) { InputMethodManager m = (InputMethodManager) getActivity() .getSystemService(Context.INPUT_METHOD_SERVICE); m.showSoftInput(editText, 0); } private void closeInput(Context context, View editText) { InputMethodManager manager = (InputMethodManager) getActivity() .getSystemService(Context.INPUT_METHOD_SERVICE); manager.hideSoftInputFromWindow(editText.getWindowToken(), 0); } protected void closeInput(View editText) { InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); manager.hideSoftInputFromWindow(editText.getWindowToken(), 0); } protected void closeInputMethod() { InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); }
方法一: 在AndroidMainfest.xml中選擇哪個(gè)activity阀趴,設(shè)置windowSoftInputMode屬性為adjustUnspecified|stateHidden ```xml <activity android:name=".Main" android:label="@string/app_name" android:windowSoftInputMode="adjustUnspecified|stateHidden" android:configChanges="orientation|keyboardHidden"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> ``` 方法二: 讓EditText失去焦點(diǎn),使用EditText的clearFocus方法 例如:EditText edit=(EditText)findViewById(R.id.edit); edit.clearFocus(); 方法三: 強(qiáng)制隱藏Android輸入法窗口 例如:EditText edit=(EditText)findViewById(R.id.edit); InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(edit.getWindowToken(),0); 2.EditText始終不彈出軟件鍵盤 例:EditText edit=(EditText)findViewById(R.id.edit); edit.setInputType(InputType.TYPE_NULL); 以上都會(huì)導(dǎo)致點(diǎn)擊時(shí)輸入法閃動(dòng)苍匆,終極方法Edittext.setInputType(InputType.NULL),這樣會(huì)徹底禁用輸入法刘急,但是也會(huì)屏蔽輸入類型設(shè)置 NUMBER、TEXT都不起作用浸踩。如果是自定義鍵盤輸入的話可以用正則匹配叔汁。
-
BigDecimal 的 add 函數(shù)。
BigDecimal a = BigDecimal.ZERO;
a.add(new BigDecimal("1"));
//a的值還是零。攻柠。球订。。
-
List 中有選擇框等控件等瑰钮,會(huì)屏蔽點(diǎn)擊
android:descendantFocusability="blocksDescendants"加到 item 可以解決
-
ProgressDialog 內(nèi)存泄露
在 Activity的 onDestroy 里要寫上 pd.dismiss冒滩。或者使用弱引用private WeakReference<Context> context;否則浪谴,顯示ProgressDialog的線程出問(wèn)題會(huì)因?yàn)锳ctivity泄露而隱藏實(shí)際的出錯(cuò)信息开睡。
-
可以代替繁瑣的findviewbyid
public <T extends View> T (View view,int id){
return (T) view.findViewById(id);
}
-
去標(biāo)題欄
1、在AndroidManifest.xml的配置文件里面的<activity>標(biāo)簽添加屬性:
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
2苟耻、在Activity的onCreate()方法中的super()和setContentView()兩個(gè)方法之間加入下面兩條語(yǔ)句
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標(biāo)題欄
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息欄
-
Android快速截圖
- 截圖:
adb shell screencap -p /sdcard/Download/12.png - 從設(shè)備拉到本地電腦
adb pull /sdcard/Download/12.png
- 截圖:
-
{@link State#RESET}注釋
-
textView.setTextAppearance(context,R.style.normal_button);//動(dòng)態(tài)切textstyle
-
Fragment 不要自定義構(gòu)造函數(shù)篇恒,在恢復(fù)現(xiàn)場(chǎng)時(shí)系統(tǒng)只能調(diào)用默認(rèn)的構(gòu)造函數(shù)。
-
ListView 單條更新
private void updateSingleRow(ListView listView, long id){
if (listView != null) {
int start = listView.getFirstVisiblePosition();
for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++){
if (id == ((Messages) listView.getItemAtPosition(i)).getId()) {
View view = listView.getChildAt(i - start);
getView(i, view, listView);
break;
}
}
}
-
ListView 兩次快速的notifyDataSetChanged會(huì)導(dǎo)致某個(gè)item 不刷新問(wèn)題凶杖。詳見(jiàn)點(diǎn)擊兩個(gè)item會(huì)同時(shí)改變背景色問(wèn)題胁艰。用ListView單條更新來(lái)解決。
View view = mListView.getChildAt(position-mListView.getFirstVisiblePosition());
getView(position, view, mListView);
-
EventBus
添加訂閱者:EventBus.getDefault().register(this);
-
訂閱者所在類可以定義以下一個(gè)或多個(gè)方法用以接收事件:
public void onEvent(MsgEvent1 msg) public void onEventMainThread(MsgEvent1 msg) public void onEventBackgroundThread(MsgEvent1 msg) public void onEventAsync(MsgEvent1 msg)
發(fā)布者發(fā)布事件:EventBus.getDefault().post(new MsgEvent1("主線程發(fā)的消息1"));
取消訂閱:EventBus.getDefault().unregister(this);
-
啟動(dòng)Activity方法
public static void actionStart(Context context, String data1, String data2) { Intent intent = new Intent(context, SecondActivity.class); intent.putExtra("param1", data1); intent.putExtra("param2", data2); context.startActivity(intent); } SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
-
確認(rèn)窗口
private void showDialog() { AlertDialog.Builder builder = new AlertDialog.Builder( SellActivity.this); builder.setTitle("系統(tǒng)提示"); builder.setMessage("退出將清空銷售列表智蝠,確定要退出嗎腾么?"); builder.setNegativeButton("否", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); SellActivity.this.finish(); } }); builder.show(); }
+ #### 一個(gè)ListView的item要響應(yīng)三個(gè)點(diǎn)擊區(qū)域,整體要響應(yīng)滑動(dòng)
用touchlistener杈湾,重寫onTouch 可以根據(jù)點(diǎn)擊位置判斷區(qū)域。(可能產(chǎn)生適配問(wèn)題)漆撞。
+ #### Android自定義鍵盤 (巨坑)
1)不能單獨(dú)改變某個(gè)按鍵樣式悍汛,只能通過(guò)多鍵盤堆疊實(shí)現(xiàn)
2)默認(rèn)鍵盤不對(duì)稱员凝,會(huì)向右偏移
+ #### 小微商戶兩步導(dǎo)出數(shù)據(jù)庫(kù)
adb shell中:cp /data/data/com.hisense.pos.xwpos/databases/xwpos.db /sdcard
cmd中: adb pull /sdcard/xwpos.db
+ #### startActivityForResult 無(wú)法調(diào)用singleTask的Activity。
在B開啟之后的瞬間(未等B返回任何result),A的onActivityResult方法就會(huì)被調(diào)用,并且收到一個(gè)RESULT_CANCEL的request code糖埋。
+ #### intent-filter
一條<intent-filter>元素至少應(yīng)該包含一個(gè)<action>,否則任何Intent請(qǐng)求都不能和該<intent-filter>匹配祟敛。如果Intent請(qǐng)求的Action和<intent-filter>中個(gè)某一條<action>匹配跑揉,那么該Intent就通過(guò)了這條<intent-filter>的動(dòng)作測(cè)試历谍。如果Intent請(qǐng)求或<intent-filter>中沒(méi)有說(shuō)明具體的Action類型,那么會(huì)出現(xiàn)下面兩種情況脱衙。
(1) 如果<intent-filter>中沒(méi)有包含任何Action類型,那么無(wú)論什么Intent請(qǐng)求都無(wú)法和這條<intent-filter>匹配眠饮;
(2)反之,如果Intent請(qǐng)求中沒(méi)有設(shè)定Action類型扔茅,那么只要<intent-filter>中包含有Action類型,這個(gè)Intent請(qǐng)求就將順利地通過(guò)<intent-filter>的行為測(cè)試
+ #### onTouch(onTouchListener中) 優(yōu)于 onTouchEvent(View中)先執(zhí)行玖瘸。
+ #### gettextsize返回像素單位
setTextSize(int size)默認(rèn)單位sp,可以使用setTextSize(type,size) type TypedValue.COMPLEX_UNIT_PX 限定。
+ #### ListView嵌套ScrollView蔑匣,重寫LisctView 的 onMeasure 方法
```java
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
```
+ #### Fragment 不會(huì)立即 commit
FragmentTransaction執(zhí)行commit方法后凿将,并非Fragment事務(wù)就立即執(zhí)行牧抵,依賴于系統(tǒng)的處理性能。當(dāng)然你可以調(diào)用executePendingTransactions()方法立即執(zhí)行弛作。其實(shí)這樣做通常沒(méi)有必要映琳,除非Fragment事務(wù)依賴于其他現(xiàn)場(chǎng)的工作任務(wù)。
+ #### 一個(gè)View.animate().setListener(...)之后谎脯,再次View.animate() 會(huì)調(diào)用上一個(gè)listener。
+ #### ListView的 item 布局如果不是透明的废麻,會(huì)覆蓋Listview的 android:listSelector 效果
+ #### 閃屏
Activity的 theme 是透明(android:windowIsTranslucent)時(shí),從其他棧Activity返回時(shí)(例如其他應(yīng)用怜姿、singleInstance的Activity、調(diào)用系統(tǒng)圖庫(kù)相機(jī) 等)會(huì)出現(xiàn)閃現(xiàn)桌面的情況搏恤。
+ #### 自定義控件
1. 繼承ViewGroup(LinearLayout 等)
2. 資源文件 attrs 中聲明 styleable
3. XML 文件中引用藤巢,并聲明屬性
4. 構(gòu)造函數(shù)中通過(guò)以下代碼獲取xml中對(duì)應(yīng)屬性 `R.styleable.IconText_left_text` (styleable名字 + " _ " + 對(duì)應(yīng)屬性名字)
```java
public class TabView extends LinearLayout {
public TabView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.share_topbar_tip, this);
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.IconText);
String leftIconTextString = a.getString(R.styleable.IconText_left_text);
a.recycle();
findControls();
addListeners();
}
}
```
```xml
<declare-styleable name="IconText">
<attr name="left_text" format="string"></attr>
<attr name="right_text" format="string"></attr>
</declare-styleable>
```
```xml
<com.hisense.pos.xwpos.ui.TabView
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:left_text = "全部交易"
/>
```
```java
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.IconText);
String leftText = a.getString(R.styleable.IconText_left_text);
a.recycle();
```
+ #### ImageView 變形
ImageView的圖片最好用src設(shè)置迈喉,用background設(shè)置會(huì)導(dǎo)致圖片變形始終填充控件孩革,并且設(shè)置scaleType無(wú)效。
+ #### EditText 不彈出輸入法
有時(shí)候EditText設(shè)置focus后饱搏,點(diǎn)擊仍然不彈出輸入法,設(shè)置Hint屬性試試坤学。
+ #### StringBuffer問(wèn)題
StringBuffer沒(méi)有覆蓋equals() 和 hashCode()方法压怠,因此,**將StringBuffer存進(jìn)Java集合類中時(shí)會(huì)出現(xiàn)問(wèn)題**蜗顽。
+ #### TextView 代替 Button
如果不是必須用Button,盡量用TextView 代替 Button雨让,在部分機(jī)器上Button 的背景設(shè)置會(huì)出現(xiàn)各種問(wèn)題雇盖。
+ #### ScrollView 中嵌套 ListView
要重寫ListView;并且在ListView外層包裹LinearLayout(不包裹栖忠,ListView底部顯示不全)
```java
public class ExpandableListViewForScrollView extends ExpandableListView {
public ExpandableListViewForScrollView(Context context) {
super(context);
}
public ExpandableListViewForScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ExpandableListViewForScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
```
```xml
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#f0eff4"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/dp20"
>
<com.hisense.pos.xwpos.commonui.ExpandableListViewForScrollView
android:id="@+id/lb_list_plus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_corner_white"
android:paddingLeft="@dimen/dp10"
android:paddingRight="@dimen/dp10"
android:paddingTop="@dimen/dp5"
android:paddingBottom="@dimen/dp5"
/>
</LinearLayout>
</ScrollView>
```
+ #### fastjson key和屬性名不一致
fastjson的key是根據(jù)javabean里面的getter和setter方法來(lái)的崔挖,不是根據(jù)屬性名的贸街,所以會(huì)出現(xiàn)這個(gè)問(wèn)題薛匪,你在屬性的get和set方法上面寫上標(biāo)注,說(shuō)明轉(zhuǎn)成什么就行了比如 @JSONField(name="SOMETHING")
+ #### okhttp Gzip不自動(dòng)unzip response
Just omit the accept-encoding header from your code. OkHttp will add its own accept-encoding header, and if the server responds with gzip then OkHttp will silently unzip it for you.
```java
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(
new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.addHeader(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded; charset=UTF-8");
//builder.addHeader("Accept-Encoding", "gzip"); 不要添加,OkHttp會(huì)自動(dòng)壓縮解壓;添加后反而不能自動(dòng)解壓
Request request = builder.build();
Response response = chain.proceed(request);
return response;
}
}
);
-
找不到layout 文件
setContentView(R.layout.activity) 找不到R.layout.activity文件,但是R.layout.activity存在滤港,可能與橫豎屏有關(guān)。
-
微信分享
微信分享沒(méi)有WXMediaMessage.title 和description 不能分享給朋友,只能分享到朋友圈。出現(xiàn)朋友列表,點(diǎn)擊沒(méi)反應(yīng)鲁冯。
-
View的位置參數(shù)
x = left + translationX
y = top + translationY
width = right - left
height = bottom - top
-
MotionEvent
getX/getY 相對(duì)于當(dāng)前View左上角x和y;getRawX/getRawY 相對(duì)于手機(jī)屏幕左上角x和y.
-
TouchSlop滑動(dòng)最小距離
get(getContext()).getScaledTouchSlop();
-
onPause 和 onResume
第一個(gè)activity的onPause執(zhí)行完后验毡,第二個(gè)activity的onResume才能執(zhí)行,因此不要在onPause中執(zhí)行耗時(shí)操作
-
android:process
android:process = ":remote" //當(dāng)前應(yīng)用的私有進(jìn)程菱皆,xxx.xxx.xxx:remote,其他應(yīng)用的組件不可以跟它跑在同一個(gè)進(jìn)程中。
android:process ="xxx.xxx.xxx.remote" //全局進(jìn)程携茂,其他應(yīng)用通過(guò)ShareUID跟他跑在同一個(gè)進(jìn)程中懒棉。(需要相同的簽名)
-
Serializable 和 Parcelable
Serializable 在反序列化的時(shí)候會(huì)檢測(cè)serialVersionUID值策严,不相等報(bào)異常。serialVersionUID = 1L 系統(tǒng)會(huì)默認(rèn)生成一個(gè)hash值倔韭。靜態(tài)成員和 transient關(guān)鍵字標(biāo)記的不參與序列化過(guò)程。
-
ThreadLocal
不同線程訪問(wèn)同一個(gè)ThreadLocal對(duì)象廊散,獲得的值是不一樣的韭畸。
-
include 僅支持android:layout_*屬性
如果設(shè)置了android:layout_*屬性,必須android:layout_height a 和ndroid:layout_width后才能生效蔓搞。
-
在一項(xiàng)操作中混用基本類型和裝箱類型胰丁,裝箱類型會(huì)拆箱。
-
View滑動(dòng)
- View自身的scrollTo/scrollBy (只能將View中的內(nèi)容進(jìn)行移動(dòng)喂分,并不能將View本身移動(dòng))
- 通過(guò)動(dòng)畫 (View動(dòng)畫是對(duì)影像操作锦庸,如果結(jié)束后需要保留最終狀態(tài) 需要有:android:fillAfter="true",并且響應(yīng)位置還是原區(qū)域;屬性動(dòng)畫則不需要 注:)
- 改變View的LayoutParams
-
overridePendingTransition Activity的過(guò)渡動(dòng)畫蒲祈,必須在startActivity 或 finish后調(diào)用才有效果甘萧。
-
無(wú)限循環(huán)的屬性動(dòng)畫需要在Activity退出時(shí)及時(shí)停止,否則會(huì)內(nèi)存泄露
-
View動(dòng)畫后setVisibility(View.GONE) 無(wú)效梆掸,需要用 view.clearAnimation()清除狀態(tài)
-
Activity.getWindow.getDecorView() 可以獲得 decor view
-
RxJava
_apiService.login(mobile, verifyCode)
.// 略 顯示提示框扬卷、切換線程
.flatMap(result -> { // 可以運(yùn)行在IO線程
if (result.getStatus() == RESTResult.FAILURE) {
HttpResponseCode code = result.getCode();
// 根據(jù)不同code進(jìn)行不同處理
...
return Observable.error(new ServerException(result.getMessage()));
}
return Observable.just(result.getData());
})
.subscribe(new Observer<User>() {
@Override
public void onCompleted() {
hideLoadingDialog();
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
hideLoadingDialog();
if(e instanceof ServerException){
Toast.makeText(_context, e.getMessage(), Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(_context, "請(qǐng)求失敗,請(qǐng)稍后重試", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNext(User user) {
// 直接是User對(duì)象
}
});
-
Android Studio .arr 文件
①.將aar包復(fù)制到libs目錄下 ②.配置build.gradle文件: 加入 repositories { flatDir { dirs 'libs' } compile(name:'camerascan-1.0', ext:'aar')
-
SparseArray ArrayMap HashMap
SparseArray 當(dāng)key 是int時(shí)可以避免自動(dòng)裝箱
ArrayMap 以時(shí)間換取空間,兩個(gè)數(shù)組分別存key 和 value酸钦,空間占用比HashMap小怪得,采用二分法查找,效率比hash低,不適用于大量數(shù)據(jù)汇恤。
-
耗時(shí)計(jì)算
start = System.nanoTime()
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)+"毫秒"
-
Assert 正確使用方式
if(BuildConfig.DEBUG && !(ctx instanceof FragmentActivity)) throw new RuntimeException();
-
ImageView的scaleType
Android中ImageView的scaleType有8個(gè)可選項(xiàng)
atrix不對(duì)圖片進(jìn)行縮放,對(duì)原圖從view的左上角繪制圖片(圖片不變形)
itXY將圖片全部繪制到view中拔恰,但是圖片會(huì)變形因谎;(圖片變形,充滿view)
itStart颜懊、fitCenter财岔、fitEnd三個(gè)屬性會(huì)選擇圖片的較長(zhǎng)的邊為基準(zhǔn)對(duì)圖片進(jìn)行縮放處理,正因?yàn)槿绱撕拥瑘D片不會(huì)完全充滿view匠璧,不同之處在于圖片在view中繪制的錨點(diǎn)不同;(圖片不變形咸这,不能充滿view)
enter不對(duì)圖片進(jìn)行縮放處理夷恍,選取view及圖片的中心點(diǎn)進(jìn)行繪制;(圖片不變形)
enterCrop會(huì)保證圖片充滿view媳维,因此會(huì)選取圖片中較短的邊為基準(zhǔn)做縮放處理酿雪;(圖片不變形,充滿view)
enterInside保證圖片顯示在view中間侄刽,當(dāng)圖片大于view時(shí)指黎,會(huì)選取圖片較長(zhǎng)的邊為基準(zhǔn)對(duì)圖片進(jìn)行縮小,當(dāng)圖片寬高小于view時(shí)州丹,直接將圖片顯示到view中間醋安。(圖片不變形)
-
點(diǎn)擊響應(yīng)錯(cuò)亂
當(dāng)前l(fā)ayout中使用了自定義控件,如果當(dāng)前l(fā)ayout中的id 與自定義控件布局中的id有重復(fù)墓毒,會(huì)導(dǎo)致點(diǎn)擊響應(yīng)錯(cuò)亂吓揪,并且編譯器沒(méi)有提示。
-
Error inflating class null
view.inflate異常:Binary XML file line #34: Error inflating class null 原因:布局文件中<View/>組件應(yīng)該為大寫V
-
PendingIntent
PendingIntent主要用于給RomoteViews添加點(diǎn)擊事件蚁鳖,具有“粘滯性”磺芭。
PendingIntent相同的判定標(biāo)準(zhǔn)
1. requestCode相同
2. Intent相同
Intent相同的判定
ComponentName和intent-filter都相同(Extras不參與比較)
PendingIntent 相同時(shí)的判定flags:
1. FlAG_ONE_SHOT 只能使用一次,相同PendingIntent send失敗
2. FLAG_NO_CREATE 不會(huì)主動(dòng)創(chuàng)建醉箕,如果不存在钾腺,工廠方法返回nul。較少使用
3. FLAG_CANCEN_CURRENT cancel當(dāng)前已存在相同PendingIntent讥裤,點(diǎn)擊無(wú)響應(yīng)放棒。新建PendingIntent
4. FLAG_UPDATE_CURRENT 存在相同PendingIntent,更新己英。
5. manager.notifu(id,notification) id相同间螟,每次只能彈出一個(gè)通知替換,無(wú)論P(yáng)endingIntent是否相同。
id不同時(shí)厢破,PendingIntent不同:新的通知荣瑟。PendingIntent相同:FlAG_ONE_SHOT:相同的只能點(diǎn)擊一個(gè),其他失效摩泪。FLAG_CANCEN_CURRENT:最新的點(diǎn)擊有效笆焰;FLAG_UPDATE_CURRENT:所有的都更新到最新的。
-
AppContext不能啟動(dòng)standard模式的 Activity
standard模式的Activity啟動(dòng)會(huì)默認(rèn)進(jìn)入啟動(dòng)它的Activity所屬棧见坑,AppContext沒(méi)有任務(wù)棧嚷掠。可以用FLAG_ACTIVITY_NEW_TASK(singleTask)荞驴。singleTask模式如果當(dāng)前沒(méi)有任務(wù)棧(如:AppContext) 不皆,系統(tǒng)會(huì)默認(rèn)創(chuàng)建任務(wù)棧。
-
AndroidMenifest 和 Intent 設(shè)定 模式的區(qū)別
AndroidMenifest 不能設(shè)定FLAG_ACTIVITY_CLEAR_TOP 標(biāo)識(shí)熊楼,Intent不能指定 singleInstance模式
-
獲取系統(tǒng)的一些資源com.android.internal.R.drawable.ic_text_dot等
int id = Resources.getSystem().getIdentifier("ic_text_dot", "drawable", "android")
-
onStart霹娄、onResume區(qū)別
onStart——Activity是否可見(jiàn) onResume——Activity是否位于前臺(tái)
-
onCreate 和 onSaveInstanceState區(qū)別
onCreate 需要判空。onSaveInstanceState區(qū)別一定有值鲫骗。
-
添加 configChanges屬性后项棠,當(dāng)發(fā)生相似情況,不會(huì)重建Activity挎峦,會(huì)調(diào)用onConfigurationChanged
-
一個(gè)Activity可以有多個(gè)intent-filter
android:onClick="onclick",onclick這個(gè)函數(shù)只能在Activity中香追,在Fragment中無(wú)效;需要包含View參數(shù):onclick(View v)
-
Handler 原理
一坦胶、處理msg的順序:
1透典、msg的callback handler.post(callback)
2、mCallback 創(chuàng)建Handler的時(shí)候可以傳 mCallback參數(shù) new Handler(mCallback)
3顿苇、handler自身的handleMessage(msg) 函數(shù) (可以重寫)
二峭咒、ThreadLocal
線程有個(gè)內(nèi)部對(duì)象ThreadLocalMap,其中 有Entry[] table數(shù)組纪岁,用來(lái)存貯線程私有對(duì)象凑队。Android25源碼中并不是Android開發(fā)藝術(shù)探索中所說(shuō)的table數(shù)組奇數(shù)位存key,key的下一位置存value幔翰。而是table數(shù)組中統(tǒng)一存Entry漩氨,entry中存value。
static class Entry extends WeakReference<ThreadLocal> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
三遗增、理解
Handler實(shí)現(xiàn)線程間的通信本質(zhì)是以共享內(nèi)存的方式實(shí)現(xiàn)的叫惊。Handler持有Looper,Looper中有MessageQueue做修。Looper是線程以ThreadLocal的方式持有的霍狰。線程A向線程B發(fā)送Msg抡草,本質(zhì)是通過(guò)Handler將Msg添加到B的Looper的MessageQueue中。循環(huán)取出并處理消息蔗坯。(Msg中通過(guò)target持有Handler的引用康震,處理消息時(shí),調(diào)用Handler的dispatchMessage(Message msg) 根據(jù)(一)中處理msg的順序處理)
-
EditText不彈出輸入法宾濒,常規(guī)方法都嘗試后看一下是否EditText控件的初始大小是0了
-
在singleTop 和 singleInstance 的Activity中startActivityForResult()啟動(dòng)另一個(gè)Activity會(huì)直接返回Activity.RESULT_CANCELED签杈。由于Framework層做了限制,Android開發(fā)者認(rèn)為不同Task默認(rèn)不能傳遞數(shù)據(jù)鼎兽,一定要傳遞只能通過(guò)Intent。
-
以FLAG_ACTIVITY_NO_HISTORY模式啟動(dòng)的铣除, 不會(huì)保留在Activity中谚咬。
-
IntentService
onCreate()的時(shí)候開啟一個(gè)HandlerThread,接收到start命令后傳遞命令給HandlerThread 的Handler尚粘,Handler調(diào)用onHandleIntent方法處理任務(wù)后調(diào)用stopSelf結(jié)束Service择卦。
-
WebView上傳文件,選擇文件返回后以postDelayed的方式上傳郎嫁。猜測(cè)秉继,返回到WebView的Activity時(shí)WebView可能需要重新進(jìn)行某些工作,在此之前操作無(wú)響應(yīng)泽铛。
-
gradle強(qiáng)制依賴版本
android {
configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
}
}