Android, флажок слушателя в XML? - PullRequest
11 голосов
/ 19 февраля 2011

Можно сделать что-то подобное

XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <Button android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:id="@+id/addContactButton"
              android:text="@string/addContactButtonLabel"  
              android:onClick="launchContactAdder"/><!-- here --> 

</LinearLayout>

Java:

public void launchContactAdder(View v)
{
    Intent i = new Intent(this, ContactAdder.class);
    startActivity(i);
}

, но существует требование, что метод должен бытьpublic, void и самое важное - взять View в качестве аргумента.

Теперь я хотел бы сделать то же самое, но с кнопкой «Флажок».Флажок имеет атрибут android: onclick, но в руководстве по Android (http://developer.android.com/resources/samples/ContactManager/index.html) я вижу этот код

showInvisibleControl.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        Log.d(TAG, "mShowInvisibleControl changed: " + isChecked);
        showInvisible = isChecked;
        populateContactList();
    }
});

Так что есть метод onCheckedChanged (CompoundButton buttonView, логический isChecked). Есть ли способ сделать этопо XML? Нет атрибута android: onCheckedChange, только атрибут android: onClick, но, как я писал выше, имя этого атрибута должно иметь соответствующее имя метода, которое принимает View в качестве аргумента, но из приведенного выше кода я понимаю, что должен иметьметод с CompoundButton и логическими аргументами.

Есть ли способ сделать это «XML-способом»?

Ответы [ 4 ]

6 голосов
/ 26 апреля 2013

Официальная документация: https://developer.android.com/guide/topics/ui/controls/checkbox.html

<CheckBox android:id="@+id/checkbox_meat"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/meat"
    android:onClick="onCheckboxClicked"/>
<CheckBox android:id="@+id/checkbox_cheese"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cheese"
    android:onClick="onCheckboxClicked"/>
4 голосов
/ 28 июля 2011

Я обнаружил аналогичную проблему с событием onItemSelected из виджета Spinner.Очевидно, команда Android подумала, что этого достаточно, чтобы позволить нам XML-событие onClick: S.

3 голосов
/ 18 мая 2016

Теперь это можно сделать с помощью библиотеки привязки данных.Сначала вам нужно создать класс обработчика (в этом примере я называю его MainActivityHandlers).Внутри этого класса обработчика определите метод (например, имя method1) с соответствующей реализацией. Затем в вашем файле макета вам просто нужно реализовать:

  ...
 <data>
    <variable
        name="handler"
        type="com.test.android.testapp.MainActivityHandlers" />
</data>
...
         <RadioGroup
        ...
        android:onCheckedChanged="@{handler.method1}"
        ...
        >

и все готово.Дополнительная информация: https://developer.android.com/topic/libraries/data-binding/index.html

0 голосов
/ 07 мая 2018

Я считаю, что использовать лямбду удобнее:

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/firstName"
    android:text="@={user.firstName}" />
<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onCheckedChanged="@{()->handler.checked(firstName)}" />

Подробнее см. this .

Кроме того, я считаю использование двухстороннего связывания очень полезным для флажков:

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked='@={user.isChecked}'/>

Обратите внимание, что onCheckedChanged вызывается до того, как двухстороннее связывание устанавливает значение.

...