データバインディングライブラリを使用してonClick
メソッドにカスタム引数を渡すことは可能ですか? onClickListenerを使用する必要があるレイアウトxmlファイルがあります。
<?xml version="1.0" encoding="utf-8"?>
<layout ...>
<data>
<variable
name="viewModel"
type="com.productivity.tiktak.ui.tracker.viewModel.CategoryViewModel"/>
<variable
name="callback"
type="com.productivity.tiktak.ui.tracker.TrackerAdapter"/>
</data>
<Android.support.v7.widget.CardView
Android:onClick="@{callback.onCategoryClick(viewModel)}"
...
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<!-- ... Some stuff -->
</Android.support.v7.widget.CardView>
</layout>
そして、私はここにクリックハンドラコードを持っています:
public void onCategoryClick(View view, CategoryViewModel categoryViewModel)
{
//handler code...
}
XMLからクリックハンドラーにCategoryViewModelオブジェクトを渡すことは可能ですか?
ラムダ式を使用できます。
Android:onClick="@{() -> callback.onCategoryClick(viewModel)}"
ビューが必要な場合は、次のようにして渡すこともできます。
Android:onClick="@{(v) -> callback.onCategoryClick(v, viewModel)}"
以下のようなプレゼンターまたはハンドラークラスがあります。
public class Presenter {
public void onSaveClick(View view, Task task){}
}
次に、レイアウトでPresenter
型の変数を使用します。以下のようにクリックを設定します。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<variable name="task" type="com.Android.example.Task" />
<variable name="presenter" type="com.Android.example.Presenter" />
</data>
<LinearLayout ...>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="@{(view) -> presenter.onSaveClick(view, task)}"
/>
</LinearLayout>
</layout>
これにさらに引数を追加できます。
これらのデータ変数を設定する必要があることに注意してください。好む
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setTask(task);
binding.setPresenter(presenter);
アクティビティ/フラグメントの変数タイプを作成します
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<variable name="task" type="com.Android.example.Task" />
<variable name="activity" type="com.example.MainActivity" />
</data>
<LinearLayout ...>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="@{(view) -> activity.onSaveClick(view, task)}"
/>
</LinearLayout>
</layout>
バインディングレイアウトから呼び出すアクティビティのメソッドを作成します。および忘れずにsetActivity(YourActivity.this)
をActivityから呼び出します。
public class MainActivity extends AppCompatActivity {
public void onSaveClick(View view, Task task) {
System.out.println("MainActivity.onSaveClick");
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setActivity(this);
binding.setTask(task);
}
}
さらに読むAndroid DataBinding documentation
クリックを設定する方法は他にもたくさんあります。 この回答