Custom event using lambda expression
Define Interface
public interface ClickHandler { public void onButtonClick(User user); }
Create Model class
public class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Layout XML
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="handler" type="com.example.ClickHandler"/> <variable name="user" type="com.example.User"/> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}" android:onClick="@{() -> handler.onButtonClick(user)}"/> </RelativeLayout> </layout>
Activity code :
public class MainActivity extends Activity implements ClickHandler { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this,R.layout.activity_main); binding.setUser(new User("DataBinding User")); binding.setHandler(this); } @Override public void onButtonClick(User user) { Toast.makeText(MainActivity.this,"Welcome " + user.getName(),Toast.LENGTH_LONG).show(); } }
For some view listener which is not available in xml code but can be set in java code, it can be bind with custom binding.
Custom class
public class BindingUtil { @BindingAdapter({"bind:autoAdapter"}) public static void setAdapter(AutoCompleteTextView view, ArrayAdapter<String> pArrayAdapter) { view.setAdapter(pArrayAdapter); } @BindingAdapter({"bind:onKeyListener"}) public static void setOnKeyListener(AutoCompleteTextView view , View.OnKeyListener pOnKeyListener) { view.setOnKeyListener(pOnKeyListener); } }
Handler class
public class Handler extends BaseObservable { private ArrayAdapter<String> roleAdapter; public ArrayAdapter<String> getRoleAdapter() { return roleAdapter; } public void setRoleAdapter(ArrayAdapter<String> pRoleAdapter) { roleAdapter = pRoleAdapter; } }
XML
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/tools" > <data> <variable name="handler" type="com.example.Handler" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <AutoCompleteTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" bind:autoAdapter="@{handler.roleAdapter}" /> </LinearLayout> </layout>
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents