web-dev-qa-db-ja.com

Switch onCheckedChageListenerイベントにデータバインディングを使用する方法

質問が示すように、チェックされた変更リスナーをxmlのスイッチボタンにバインドする方法は?

リサイクルビューを使用していません。シンプルなレイアウト。

任意の助けに感謝します。

24

メソッド参照でそれを行うことができます:

<CheckBox Android:onCheckedChanged="@{callback::checkedChangedListener}".../>

または、異なるパラメーターを渡す場合はラムダ式を使用します。

<CheckBox Android:onCheckedChanged="@{() -> callback.checked()}".../>
8
George Mount

ラムダ式とSwitchの使用:

public void onCheckedChanged(boolean checked) {
     // implementation      
}

XMLファイル:

<Android.support.v7.widget.SwitchCompat
    Android:onCheckedChanged="@{(switch, checked) -> item.onCheckedChanged(checked)}"
    ...
/>

itemonCheckedChangeメソッドを実装するクラスで、次のようにXMLファイルにインポートされます。

<data>
    <variable
        name="item"
        type="yourClass"/>
</data>
27
tomrozb

違う方法

(1) メソッド式 で設定

レイアウト内

<variable
    name="activity"
    type="com.innovanathinklabs.sample.activities.CalendarActivity"/>

<Switch
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:checked="@={model.checked}"
    Android:onCheckedChanged="@{activity::onGenderChanged}"
    />

アクティビティ中

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
        binding.activity = this
        binding.model = Model()
    }

    fun onGenderChanged(buttonView: CompoundButton, isChecked: Boolean) {
        println("buttonView = [$buttonView], isChecked = [$isChecked]")
    }
}

(2) lambda expression およびメソッド呼び出しにより設定

<variable
    name="model"
    type="com.innovanathinklabs.sample.data.Model"/>

<variable
    name="activity"
    type="com.innovanathinklabs.sample.activities.HomeActivity"/>

<Switch
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:checked="@={model.checked}"
    Android:onCheckedChanged="@{(button, bool)-> activity.saveGender(bool)}"
    />

活動中

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
        binding.activity = this
        binding.model = Model()
    }

    fun saveGender(isChecked: Boolean) {
        println("isChecked = [$isChecked]")
    }
}

(3)OnCheckedChangeListener匿名クラスをレイアウトに渡します

<variable
    name="onGenderChange"
    type="Android.widget.CompoundButton.OnCheckedChangeListener"/>

<Switch
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:checked="@={model.checked}"
    Android:onCheckedChanged="@{onGenderChange}"
    />

活動中

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
        binding.model = Model()
        binding.setOnGenderChange { buttonView, isChecked ->
            println("buttonView = [$buttonView], isChecked = [$isChecked]")
        }
    }
}

(4)OnCheckedChangeListenerを参照渡し

<variable
    name="onGenderChange2"
    type="Android.widget.CompoundButton.OnCheckedChangeListener"/>

<Switch
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:checked="@={model.checked}"
    Android:onCheckedChanged="@{onGenderChange2}"
    />

アクティビティ

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityCalendarBinding>(this, R.layout.activity_calendar)
        binding.model = Model()
        binding.onGenderChange2 = onGenderChange
    }

    private val onGenderChange: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
        println("buttonView = [$buttonView], isChecked = [$isChecked]")
    }
}

以下は動作しません

CheckChangeListenerを設定すると、動作しないコードになります。 1つのコンポーネントに2つのコールバックを設定できないためです。バインドによって1つのコールバックが既に設定されているため、コード内のコールバックは機能しません。

binding.mySwitch.setOnCheckedChangeListener { buttonView, isChecked ->
    println("buttonView = [$buttonView], isChecked = [$isChecked]")
}

CheckCompoundButtonBindingAdapterclass Switch Bindingの動作を確認します。

7
Khemraj