Android XML Layout Inflater и абстрактные классы - PullRequest
0 голосов
/ 19 сентября 2018

TL; DR;Если Activity расширяет класс Abstract, который определяет метод, то почему этот метод не был "найден"?

Я наблюдаю за поведением в Android и не могу определить, является ли это ожидаемым результатом.или нет.

У меня есть активность с методами, которые не могут быть найдены методом AppCompatViewInflater.onClick

У меня есть активность, в ней есть кнопки, которые имеют android:onClick атрибут («метод (представление представления)») как определено:

Имя метода в контексте этого представления, который вызывается при щелчке по представлению.Это имя должно соответствовать общедоступному методу, который принимает ровно один параметр типа View.Например, если вы укажете android: onClick = "sayHello", вы должны объявить публичный метод void sayHello (View v) вашего контекста (обычно вашей деятельности).

В моем примере яимеют следующие классы:

ParentExampleActivity

abstract class ParentExampleActivity extends AppCompatActivity{
    abstract void reset(View view);
    abstract void update(View view);
}

ExampleActivity

class ExampleActivity extends ParentExampleActivity {
    public void reset(View view) {...}
    public void update(View view) {...}
    public void alter(View view) {...}
}

У меня есть следующий макет

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ExampleActivity">
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="alter"
                android:text="ALTER"/>
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="update"
                android:text="UPDATE"/>
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="reset"
                android:text="RESET"/>
    </LinearLayout>

Но вызывает:

java.lang.IllegalStateException: Не удалось найти метод update (View) в родительском или родительском контексте для android: атрибут onClick, определенный в классе представления android.support.v7.widget.AppCompatButton

Но метод alter работает как задумано ...

Как получилось?

Ответы [ 2 ]

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

Похоже, что это функция совместимости или недостаток

В 3 разных устройствах у меня было разное поведение (у меня только 3 устройства для тестирования SM-T825, T815Y и XT1603)

ВSM-T825 (Зефир), у меня только alter работает

В T815Y (Lollipop) у меня все работает ...

В XT1603 (Kitkat) у меня естьтолько alter работает

После того, как я поиграл с моим кодом и сделал несколько (неотслеживаемых) изменений, я смог развернуться на всех 3 устройствах и иметь правильное поведение.

Похоже, чтоаннулирование кэша в Android Studio и перезапуск - вот что решило проблему.

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

Вы уверены, что методы обновления и сброса имеют public модификаторы доступа в классе ExampleActivity?Потому что у ParentExampleActivity нет модификатора доступа public для этих абстрактных методов.Поэтому, когда студия android реализовала эти абстрактные методы в ExampleActivity, это не сделало бы их публичными.В идеале ваш код должен выглядеть так:

abstract class ParentExampleActivity extends AppCompatActivity{
    public abstract void reset(View view);
    public abstract void update(View view);
}
class ExampleActivity extends ParentExampleActivity {
    public void reset(View view) {...}
    public void update(View view) {...}
    public void alter(View view) {...}
}
...