Android: есть ли способ обойти SuperNotCalledException? - PullRequest
3 голосов
/ 20 октября 2011

Я пытаюсь переопределить класс, производный от Activity (называемый NativeActivity), чтобы я мог настроить свое собственное представление контента, созданное в Java, оставив остальную часть его функциональности в такте.Я должен использовать NativeActivity, потому что это единственный способ получить ввод с сенсорной панели в Xperia Play.Метод, который мне нужно переопределить, - это метод NativeActivity.onCreate (), потому что именно там задается нежелательное представление содержимого.Проблема в том, что если я не вызываю super.onCreate () в моем переопределенном методе onCreate (), возникает исключение SuperNotCalledException.Это происходит из класса Activity.Но все, что делает метод Activity.onCreate (), устанавливает логическое значение:

        protected void onCreate(Bundle savedInstanceState) {
            mVisibleFromClient = !mWindow
                    .getWindowStyle()
                    .getBoolean(
                            com.android.internal.R.styleable.Window_windowNoDisplay,
                            false);
            mCalled = true;
        }

Я могу сделать эту проверку в своем собственном коде, используя метод Activity.getWindow ().К сожалению, логическое значение mCalled является закрытым, поэтому я не могу просто установить его значение true в своем собственном коде.Я не могу понять, как обойти это требование.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Одна вещь, которую я понял из изучения исходного кода для Activity, это то, что вы можете вызвать один из методов, которые устанавливают mCalled в true в базовом предложении Activity, которые не переопределяются в подклассе и которые ничего не делают в базовой Activity учебный класс. Так что в случае с NativeActivty можно вызвать что-то вроде super.onRestart();, потому что этот класс не переопределяется NativeActivity, и, как вы можете видеть ниже, он ничего не делает в классе Activity:

protected void onRestart() {
    mCalled = true;
}

Это довольно хакерский и может быть сломан в какой-то будущей версии, но может быть быстрым решением, если вам не нужно создавать заново весь подкласс Activity только из-за одного простого логического значения.

0 голосов
/ 20 октября 2011

Вы должны вызвать super.onCreate(savedInstance) при переопределении этого метода в Activity.

При просмотре кода эта проверка выглядит так, как будто она предназначена для проверки правильности работы любого пользовательского инструментария. И требование вызова super для некоторых методов во всех наших пользовательских действиях было непреднамеренным следствием реализации.

Не вдаваясь в детали , почему это плохой дизайн ООП, я могу сказать, что по крайней мере достаточно просто просто вызвать super.onCreate(savedInstanceState) в вашем методе onCreate (). Как видно из кода, плохих побочных эффектов нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...