Android: почему я не могу переопределить setFrame From View? - PullRequest
4 голосов
/ 20 января 2011

Просто пытаюсь расширить View и выполнить некоторую пользовательскую работу, но Eclipse будет жаловаться, когда я попытаюсь переопределить метод setFrame. Утверждение, что в родительском классе нет метода для переопределения:

Метод setFrame (int, int, int, int) типа Test должен переопределить или реализовать метод супертипа

Вот подпись метода из источника Android SDK.

protected boolean setFrame(int left, int top, int right, int bottom)

Как вы можете видеть, это не частный или пакетный уровень, или даже не задан как окончательный ... просто защищенный. Что должно означать, что я полностью могу переопределить это в подклассе. Правильно? Ниже приведен минимум того, что я пытаюсь сделать в Eclipse. Возможно, это просто ошибка Eclipse, но я не слишком знаком с использованием Ant для проверки.

Редактировать: Тем, кто отвечает, что setFrame не определен в классе View, могу вас заверить. Как еще вы думаете, я получил подпись метода? Он даже вызывается во время компоновки (). Или я серьезно просто сумасшедший?

git HEAD: View.java
Кекс (1.5r4): View.java

Вы даже можете увидеть, как метод переопределяется в классах ImageView и TextView ... вот почему я серьезно озадачен тем, почему я не могу переопределить его непосредственно из View напрямую ...

public class Test extends View {
    public Test(Context context) {
        super(context);
    }

    public Test(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public Test(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected boolean setFrame(int left, int top, int right, int bottom) {
        return super.setFrame(left, top, right, bottom);
    }
}

Ответы [ 2 ]

4 голосов
/ 20 января 2011

Согласно документации, setFrame не определено в классе View ( не совсем верно - см. Редактирование ).Удивительно, но каждый подкласс TextView и ImageView определяет его самостоятельно.Вам придется расширять определенный подкласс для каждого виджета, который вы хотите переопределить.Это основано на документах для Android 2.3 r1 - 05 Jan 2011 12:43.

См. Документацию:

Классы, которые определяют setFrame
http://www.google.com/search?q=site:developer.android.com+%22boolean+setFrame%22

TextView и ImageView .

Редактировать:

Как указывает OP в комментариях, метод четко определен в исходном коде View.java,Однако документация действует так, как будто метод там не определен.

Причина этого в том, что метод setFrame () в View имеет тег @hide Javadoc:

/**
 * Assign a size and position to this view.
 *
 * This is called from layout.
 *
 * @param left Left position, relative to parent
 * @param top Top position, relative to parent
 * @param right Right position, relative to parent
 * @param bottom Bottom position, relative to parent
 * @return true if the new size and position are different than the
 *         previous ones
 * {@hide}
 */
protected boolean setFrame(int left, int top, int right, int bottom) {

Очевидно, это скрывает метод от Javadoc:

http://www.androidjavadoc.com/?p=63

Особое [sic] внимание необходимо обратить на тег @hide, который может использовать стандартный доклет 't интерпретировать и который скрывает источник, отличный от SDK, и поэтому этот код не должен использоваться в приложениях .

Возможно, причина, по которой он не может быть переопределен, заключается в том, что плагин Eclipse для Android или компилятор Android каким-то образом принудительно применяет тег @hide?Я не знаю.

1 голос
/ 20 января 2011

Поскольку setFrame не определен в Класс просмотра

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