Как установить android:onClick в xml пользовательского представления?

Я видел этот SO вопрос и хочу реализовать принятый ответ для пользовательского представления.

Потому что в XML моего пользовательского представления он не распознает никакого метода для android:onClick ни для каких кнопок! Интересно, это из-за пользовательского представления, может быть, мне следует просто использовать метод onClick в xml активности.

Можно ли установить метод для атрибута кнопки android:onClick в пользовательском пользовательском представлении (которое расширяет LinearLayout), как показано ниже:

это мой пользовательский вид:

public class CustomEditText extends LinearLayout{
...
    public void myMethod(View v) {

        switch (v.getId()) {
        case R.id.btn_down:
            // do stuff;
            break;
        case R.id.btn_down_double:
            // do stuff;
            break;
        }
    }

}

и это мой xml-файл:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_weight="wrap_content"
        android:background="@drawable/bg_ctrl"
        android:orientation="vertical">

        <android.support.v7.widget.AppCompatButton
            android:id="@+id/btn_down"
            style="@style/CustomButton"
            android:onClick="myMethod"
            android:theme="@style/CustomButton.RED" />

        <android.support.v7.widget.AppCompatButton
            android:id="@+id/btn_down_double"
            style="@style/CustomButton"
            android:onClick="myMethod"
            android:theme="@style/CustomButton.RED2" />

    </LinearLayout>

</LinearLayout>

это ошибка:

FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not find method myMethod(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'btn_down'

ОБНОВЛЕНИЕ:

родителем этого пользовательского представления является фрагмент, и я переместил myMethod() в этот фрагмент, но ошибка все еще сохраняется :-|


person par4301    schedule 21.02.2016    source источник


Ответы (3)


Это должно быть в вашем коде класса активности:

    public void myMethod(View v) {

        switch (v.getId()) {
          case R.id.btn_down:
            // do stuff;
            break;
          case R.id.btn_down_double:
            // do stuff;
            break;
        }
    }
person Mussa    schedule 21.02.2016
comment
спасибо, Мусса, за ответ, на самом деле это фрагмент (хост для этого пользовательского представления), и когда я определяю myMethod() во фрагменте, это не имеет никакого значения :( в моем файле xml этот myMethod не признан :-| - person par4301; 21.02.2016
comment
Этот метод должен быть активен, а не фрагментирован. - person Mussa; 21.02.2016

Пожалуйста, определите 'myMethod()' в классе активности.

Если вы хотите добавить его во фрагмент, вам нужно определить его в onClickListener кнопки, и если вы хотите вызвать этот метод на нескольких кнопках, вы можете создать частный метод и вызывать его из нескольких onClickLisetner.

Подробнее о методе onClick xml и onClickListener:

Чем именно XML-атрибут android:onClick отличается от setOnClickListener ?

person Rohit Gulati    schedule 21.02.2016
comment
спасибо, Рохит, я понял, однако, поскольку я хотел использовать этот метод локально в пользовательском представлении (файл .jar), тогда истинный ответ заключается в том, что в моем случае вызов метода в android: onClick не является хорошим решением (в xml-файле) - person par4301; 22.02.2016

как принятый ответ и ответ @ROHIT, невозможно определить myMethod() в фрагменте/пользовательском представлении (файл .jar) для использования в любом файле .xml...

поэтому, чтобы вызвать myMethod() в android:onClick="myMethod", определение myMethod должно быть, во-первых, public, а во-вторых, в Activity!

Хотя в моем случае это не решение, потому что я хочу использовать myMethod() в CustomEditText.jar для легкого доступа к локальным переменным (особенно в случае, если я копирую это пользовательское представление для разных целей).

person par4301    schedule 22.02.2016