Вопрос по android – Какой метод вызывается в тот момент, когда действие полностью выложено и готово для взаимодействия с пользователем?

20

Мне нужен способ запуска некоторого кода в тот момент, когда действие будет полностью загружено, разложено, отрисовано и готово для сенсорного управления пользователя. Какой метод / слушатель делает это?

@CommonsWare: на iOS есть такой момент, этоviewDidAppear, Редко требуется, но я иногда использовал его. В Android нет аналогичного обратного вызова. МОЖЕТ переопределить представление верхнего уровняonDraw, вызовите base.onDraw, затем сделайте пользовательский код. Также нужно будет запустить код после тестирования флага, установленного вonResumeи очищается после запуска этого кода - так что он запускается только один раз заonResume, Как вы думаете, это будет примерно такой же момент, как iOSviewDidAppear? ToolmakerSteve
Это может помочь, если вы на самом деле потрудились объяснить, что, по вашему мнению, вы планируете делать «в точный момент». В конце концов, вы предполагаете, что существует такой «точный момент» (на самом деле это не так), и вы предполагаете, что существует такой момент, когда вы можете получить контроль над «выполнением некоторого кода». CommonsWare
@ToolmakerSteve: я не разработчик iOS и поэтому не знаю семантикиviewDidAppear, Ничто не мешает вам делать то, что вы предлагаете, но я думаю, что есть лучшее решение для любой проблемы, которую вы пытаетесь решить с помощьюviewDidAppear эквивалент. CommonsWare
Я не думаю, что это имеет отношение к рассматриваемому вопросу, а именно - какой метод вызывается в этот момент или через некоторое время после него. В любом случае, я планирую вызвать метод, который загружает текстуры, которые, как я обнаружил, работает неправильно, если не вызывать их после того, как все выложено и видно saarraz1

Ваш Ответ

5   ответов
0

onRestoreInstanceState метод, который вызывается для восстановления состояния пользовательского интерфейса, который вызывается послеonResume . Я думаю, что вы можете использовать этот метод onRestoreInstanceState .. и поместить свой код после восстановления состояния пользовательского интерфейса из saveInstanceState ...

Не правда сейчас (и, возможно, никогда не было ...). Когда деятельность впервые создается,onRestoreInstanceState являетсяnot называется. Там нет ничего, чтобы восстановить, поэтому нет причин для ОС, чтобы вызвать его. Я верю (хотя и не уверен), что это такжеwon't be called (даже при возвращении из фона), если вы ранее не сделалиonSaveInstanceState пока приложение уходило в фон. [Протестировано только сейчас, на эмуляторе под управлением Android API 23.]
11

Я обнаружил, что если я опубликуюRunnable в очередь сообщений, она будет запущена после того, как будет извлечено содержимое для действия. Например, если я хочу ширину и высотуViewЯ бы сделал это:

view.post( new Runnable() {

    @Override
    public void run() {

        int width = view.getWidth(); // will be non-zero
        int height = view.getHeight(); // will be non-zero
    }
} );

Я добился успеха с этим в любое время после того, как позвонюsetContentView().

Это просто неправильно.
См. Ответ Саймона для более "правильного" ответа. метод.
@JBlaz это работает и имеет логический смысл, если вы понимаете, как работает очередь сообщений пользовательского интерфейса, но это скорее обходной путь. Ответ Саймона, вероятно, самый чистый подход.
Этот сработал для меня лучше, чем ответ Саймона
@JasonRobinson: я думаю, что ответ Саймона начинается послеlayout, но преждеdrawing, Это отличается от того, что спросил OP.
-1

ПытатьсяonPostResume() называется послеonResume() в этот момент экземпляр Activity должен быть видимым, и все базовые представления отображаются. Во многих ситуациях это верно, когдаonResume() называется также.

Я бы не сказал, что это не рекомендуется, то, что они говорят, «Приложения обычно не реализуют этот метод». как это предназначено для других целей
Такой же. Фактически не рекомендуется использовать его:developer.android.com/reference/android/app/…
Я уверен, что ваше последнее предложение неверно -onResume вызывается перед любым просмотромonDraw, Ваше первое предложение также неверно, по крайней мере, при отображенииfragment, [Я не проверял, когда нет фрагмента.] Это можно продемонстрировать, создав фрагмент с настраиваемым представлением в качестве представления верхнего уровня и установив перерыв в представлениях.onDraw, С фрагментами единственное различие между действиямиonResume а такжеonPostResumeявляется то, что фрагментonResume работает во времяonPostResumeтак код ты поставилafter base.onPostResume(); может полагаться на фрагмент возобновив.
-1

Может быть, это мало помогает:

@Override
public void onAttachedToWindow(){}
Я не уверен, почему этот ответ так опровергнут. Это сработало для меня. Мне нужно было показать всплывающее окно, но я не смог сделать это из onCreate, потому что я получал & quot; Невозможно добавить окно - нулевой токен недействителен; ваша деятельность продолжается? & quot;
24

Commonsware прав, не объясняя, что вы пытаетесь сделать и почему, невозможно ответить на ваш вопрос, и я подозреваю, что подробно, вы, вероятно, думаете об этом неправильно.

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

Я мог бы расширить каждый из классов представления в макете и переопределитьonMeasure() но это было бы много работы. Итак, я закончил этим заниматься. Не отлично, но это работает.

mainMenuLayout - это макет, с которым мне нужно было получить фанк.onGlobalLayout обратный вызов вызывается, когда макет завершил рисование.Utils.setTitleText() это место, где происходит фанки, и когда я передаю ему mainMenuLayout, он получает доступ к позиции и размеру всех дочерних представлений.

mainMenuLayout.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {

                    // only want to do this once
                    mainMenuLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);

                    // set the menu title, the empty string check prevents sub-classes
                    // from blanking out the title - which they shouldn't but belt and braces!
                    if (!titleText.equals("")){
                        Utils.setTitleText(_context,mainMenuLayout,titleText);
                    }

                }
            });
Я думаю, что этот код будет работать послеlayout, но преждеdrawing, который отличается от того, что спросили.
красивый ответ, за исключением первого абзаца. Почему это отношение? парень четко показал все необходимые данные. В любом случае, в моем случае представления заголовка, добавленного в ListView, прослушиватели ViewTreeObserver не сделали этого. Это сработало, создав подклассы View и переопределив его метод onLayout (), как описано. Забавно, что метод вызывался дважды, при первом вызове фактически не отображалось представление заголовка.

Похожие вопросы