web-dev-qa-db-ja.com

Android onClickメソッドへのデータバインディングパス引数

データバインディングライブラリを使用して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オブジェクトを渡すことは可能ですか?

41
kolodach

ラムダ式を使用できます。

 Android:onClick="@{() -> callback.onCategoryClick(viewModel)}"

ビューが必要な場合は、次のようにして渡すこともできます。

 Android:onClick="@{(v) -> callback.onCategoryClick(v, viewModel)}"
86
yigit

複数の方法:

解決策1(プレゼンターがいる場合)

以下のようなプレゼンターまたはハンドラークラスがあります。

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);

解決策2(プレゼンターがいない場合)

アクティビティ/フラグメントの変数タイプを作成します

<?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

クリックを設定する方法は他にもたくさんあります。 この回答

6
Khemraj