練習(xí)心得
- 事件傳遞優(yōu)先級(jí):listener > view回調(diào) > activity回調(diào)彻采,如果在回調(diào)環(huán)節(jié)事件處理方法返回true评肆,則事件被消費(fèi)歌径,不在向后傳遞损合,反之會(huì)一直向后傳遞(* 監(jiān)聽(tīng)器時(shí)間返回true也會(huì)向后傳遞*)俱饿;如果是繼承關(guān)系的傳遞,不會(huì)傳給父類(lèi)
- 自定義view一定要重寫(xiě)帶AttributeSet的構(gòu)造方法塌忽,否則編譯時(shí)匯報(bào)inflateException
- 如果activity中重寫(xiě)onKeyDown方法沒(méi)有調(diào)用super.onKeyDown(keyCode, event)復(fù)用父類(lèi)方法,則比如按手機(jī)返回鍵不會(huì)觸返回上一個(gè)activity或者退出應(yīng)用失驶,所以一定要用super復(fù)用父類(lèi)方法
- View或者Activity的回調(diào)方法onKeyDown只有硬件鍵盤(pán)事件才會(huì)觸發(fā)響應(yīng)土居,軟鍵盤(pán)不會(huì)觸發(fā)
代碼樣例
Activity
/**
* Created by Rambo
*/
public class MyActivity extends MainActivity {
private EditText myEditText = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
myEditText = (EditText)findViewById(R.id.myEditText);
myEditText.setKeyListener(new KeyListener() {
@Override
public int getInputType() {
return 0;
}
@Override
public boolean onKeyDown(View view, Editable editable, int i, KeyEvent keyEvent) {
// listener的事件消費(fèi)優(yōu)先級(jí)高于回調(diào),事件會(huì)傳遞給對(duì)應(yīng)View的回調(diào)嬉探,即便return true也會(huì)傳遞
Log.v(TAG, "myEditText-KeyListener");
return false;
}
@Override
public boolean onKeyUp(View view, Editable editable, int i, KeyEvent keyEvent) {
return false;
}
@Override
public boolean onKeyOther(View view, Editable editable, KeyEvent keyEvent) {
return false;
}
@Override
public void clearMetaKeyState(View view, Editable editable, int i) {
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 事件會(huì)傳遞給其父類(lèi)的onKeyDown方法
Log.v(TAG, "MyActivity.onKeyDown");
return false;
}
}
自定義View
/**
* Created by Rambo
*/
public class MyEditText extends EditText implements Contants {
public MyEditText(Context context) {
super(context);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
Log.v(TAG, "MyEditText.onKeyDown");
// 返回false擦耀,事件會(huì)傳遞給包含其的Activity
return false;
}
}
上述事件消費(fèi)方法返回值均為false,所以會(huì)進(jìn)行事件傳遞涩堤,運(yùn)行結(jié)果如下:
事件傳遞
將MyEditText.onKeyDown的返回值改為true眷蜓,可以看到事件直接被消費(fèi)掉了,不會(huì)再傳遞給包含其的Activity胎围,運(yùn)行結(jié)果如下:
事件消費(fèi)