使用
先看完整的邏輯
1.代碼
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
final Presenter presenter = new Presenter();
binding.setMsg("hhhhhh");
binding.setPresenter(presenter);
}
2.xml
android:onClick="@{()-> presenter.handler(msg)}" 這句根據gradle插件不同,使用不同的方式。如: android:onClick="@{handlers.showToast}"。但是新的Androidstdudio版本使用的高版本的Gradle插件,好像都是使用lamda表達式,看來這是趨勢。
<data>
<variable
name="presenter"
type="com.example.myapplication.Presenter" />
...
<Button
android:id="@+id/click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{()-> presenter.handler(msg)}"
android:text="點擊+1" />
還有如果你想傳當前view 作爲參數:
android:onClick="@{(view)-> presenter.handler(view,msg)}"
這樣就能傳入當前view 進入邏輯了。
3.對象類
public class Presenter {
public void handler(String msg){
Log.d("Presenter", "onClick: "+msg);
}
}
總結:
整體邏輯不難,當時在activity裏少了一句 binding.setPresenter(presenter);官方文檔也沒有提示。我們在xml 聲明和引入了presenter,但是我們需要構建一個presenter對象,來通過xml的綁定類傳入到佈局裏一個presenter,這樣xml的presenter對象纔有實際意義。因此才能調用成功。