問題描述
在一次開發(fā)過程中姥宝,需要將Android中的點擊事件傳給RN端處理,按照例程很快就能寫出發(fā)送事件的代碼斗锭,看起來沒有一點問題的代碼最后發(fā)現(xiàn)RN端接收不到事件由桌,代碼如下:
reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
getId(),
"onButtonClick",
null
);
問題原因
無奈只能拿出以前寫的成功傳遞事件的代碼一條條對,最后發(fā)現(xiàn)竟然是getId()這個方法出了問題帆谍,之前也懷疑過伪朽,但是修改了一下還是出錯,現(xiàn)總結主要有兩點誤區(qū):
- 以為getId()返回任意一個數(shù)據(jù)汛蝙,比如0烈涮,就可以達到效果
- 以為資源文件R.layout.xx就等于設置了該布局的View的id
錯誤的代碼如下:
1.返回任意一個數(shù)據(jù)
private int getId() {
return 0;
}
2.返回資源文件作為id
private int getId() {
return R.layout.ui_test;
}
正是上面兩個誤區(qū)導致了找不出RN端接收不到事件的原因。
解決方案
在知道了誤區(qū)之后窖剑,就知道應該從view中獲取id坚洽,代碼如下:
public class RNLightAppUI extends SimpleViewManager<RelativeLayout> {
//用字段來保存View和Context
private View view;
private ThemedReactContext reactContext;
...
//在初始化時將View和Context初始化
@Override
protected RelativeLayout createViewInstance(ThemedReactContext reactContext) {
RelativeLayout view = (RelativeLayout) LayoutInflater.from(reactContext).
inflate(R.layout.ui_test, null);
this.reactContext = reactContext;
this.view = view;
//設置點擊事件
view.findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//發(fā)送事件到RN
reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
getId(),
"onButtonClick",
null
);
}
});
}
/**
* 傳遞事件的罪魁禍首,一定要傳this.view.getId()
*/
private int getId() {
return this.view.getId();
}
//將事件映射到RN端
@Override
public Map getExportedCustomDirectEventTypeConstants() {
return MapBuilder.of(
"onButtonClick",
MapBuilder.of("registrationName", "onButtonClick")
);
}
}