Макеты Android: определите onClick в макете XML, который ссылается на метод в суперклассе - PullRequest
0 голосов
/ 19 октября 2018

В моей деятельности есть кнопка с именем LoginActivity, полученная из BaseActivity.Внутри его файла макета у меня есть объявление ниже:

    <ImageButton
        android:id="@+id/backPressed"
        style="@style/Widget.AppCompat.ActionButton"
        android:layout_width="?attr/actionBarSize"
        android:layout_height="?attr/actionBarSize"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:onClick="act"
        android:src="@drawable/ic_arrow_back" />

Процесс сборки выдает сообщение об ошибке ниже:

Corresponding method handler '`public void act(android.view.View)`' not found

Хотя это определено в суперклассе.Я хочу знать, как я должен ссылаться на BaseActivity.act(..) внутри макета LoginActivity.

А вот объявление BaseActivity.act():

fun act(view: View) {
        val context = view.context
        when (view.id) {
            R.id.backPressed-> //some stuff
        }
}

1 Ответ

0 голосов
/ 19 октября 2018

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

Переопределить действие в дочернем классе и вызвать родительский метод

public class BaseActivity extends Activity {
    public void act(View view) {
        // Implementation
    }
}

public class LoginActivity extends BaseActivity {
    @Override
    public void act(View view) {
        super.act(view);
    }
}

Сохранение окончательной реализации

Как вы упомянули, ваш метод является окончательным.Итак, если вы хотите сохранить реализацию исключительно в BaseActivity, вы можете сделать что-то вроде:

public class BaseActivity extends Activity {
    public final void handleAct(View view) {
        // Implementation
    }
}

public class LoginActivity extends BaseActivity {

    @Override
    public void act(View view) {
        handleAct(view);
    }
}

Является ли действие общим для всех действий?

Еще один моментвы можете учитывать тот факт, что ваш базовый класс должен реализовывать методы, которые являются общими для всех дочерних действий.Если act относится только к LoginActivity, то он не должен быть реализован в BaseActivity, а только в LoginActivity. В противном случае любой класс, который расширяет BaseActivity, будет нести метод act без необходимости..

РЕДАКТИРОВАТЬ Проверьте комментарии pankaj-kumar .Возможно, все, что вам нужно сделать, это добавить public к сигнатуре метода:

public fun act(view: View) {
    ...
}
...