Intereting Posts
Извлечение контекста из фрагмента Использование JSON-файла в приложениях для Android-приложений Правый выравнивающий столбец в таблице таблиц Android Поток Android до тех пор, пока не появится Во время прокрутки фоны ListView становятся черными – как исправить? Градиент построения Android слишком медленный (разрешение зависимостей) Будет ли этот метод вызываться? (Все еще требуется принятый ответ … См. Подробности в ответе) Проверить введенное значение – номер или нет. Проверка наличия идентификатора в ресурсах (R.id.something) Как преобразовать строку в значение float в android Как обрабатывать сенсорные события на фрагменте? Как я могу управлять сеансом в Android login / logout? Фокусировка запроса EditText Java.lang.RuntimeException: Parcelable столкнулся с IOException, записывающий сериализуемый объект в Android, передающий объект ArrayList Как удалить добавленную маржу Android WebView?

Жизненный цикл операции – получение уведомления о том, что макет завершен

У меня есть активность, в которой у меня есть три кнопки, расположенные рядом друг с другом. Я использовал подкласс Button, который изменит размер текста кнопки, чтобы предотвратить обтекание текста. Я хотел бы, чтобы 3 кнопки имели одинаковый размер текста. Для этого я намерен обнаружить кнопку с наименьшим размером текста и установить другие 2 кнопки на этот размер текста.

Проблема, с которой я сталкиваюсь, – это знать, когда Activity завершила работу над компонентами, чтобы я мог достоверно знать, что произошло изменение размера текста. Из документации для Android будет видно, что последнее уведомление в жизненном цикле – onResume (), но похоже, что макет еще не завершился на этом этапе. Есть ли способ получить уведомление о завершении макета активности?

Solutions Collecting From Web of "Жизненный цикл операции – получение уведомления о том, что макет завершен"

Я сделал что-то подобное с помощью Tree Observer. Возможно, вам придется немного поиграть с ним, чтобы найти, какой вид (ы) он должен быть прикреплен тоже, но это срабатывает после установки представления. Оттуда вы можете получить размер текста и внести любые изменения.

 mTestButton.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // make sure it is not called anymore mTestButton.getViewTreeObserver().removeGlobalOnLayoutListener(this); float size = mTestButton.getTextSize(); } }); 

РЕДАКТИРОВАТЬ:
Метод #removeGlobalOnLayoutListener устарел, но остается в силе. Чтобы использовать как новый, так и старый метод, см. Этот ответ stackoverflow .

Из того, что я знаю, нет события или что-то, что говорит вам, что все загружено. То, что вы, возможно, можете сделать, это в конце метода oncreate запустить AsyncTask, который выполняется, пока ширина вашего последнего представления равна 0. Когда макет будет загружен, представления будут иметь фактический размер вместо 0, чтобы вы знали его загрузку. В обратном вызове из ASyncTask вы можете вычислить самую маленькую кнопку и определить шрифт.

Методы обратного вызова жизненного цикла Activity и его окно / макет не связаны друг с другом. Тем не менее, вы гарантируете, что Button существует, пока вы манипулируете ими после setContentView .

Возможно, вы могли бы установить OnLayoutChangeListener на своих кнопках (или в группу просмотра, содержащую кнопки), и изменить размер шрифта там? Я не уверен, что это вызвано до или после изменения макета вступили в силу …

Вы можете попробовать переопределить Activity.onWindowFocusChanged (boolean), чтобы надежно получать уведомление, когда активность стала видимой. Затем вы можете предположить, что макет завершен. Одна из проблем, которые могут возникнуть с этим подходом, – это действие будет видимым для пользователя, и, таким образом, если текст кнопки будет изменен, то изменение размера будет кратковременно видимым для пользователя.

Android будет выполнять макет в два шага , измерение и макет. Поскольку вы просто хотите размер кнопки, вы можете использовать getMeasuredWidth вместо getWidth, так как это будет доступно ранее.

Я бы рекомендовал вам использовать LinearLayout вместо того, чтобы вручную определять ширину кнопок. Удостоверьтесь, что у android: weightSum указан, особенно если вы собираетесь использовать макет не полной ширины.

 <LinearLayout ... android:orientation="horizontal" android:weightSum="3" > <Button ... android:layout_weight="1" /> <Button ... android:layout_weight="1" /> <Button ... android:layout_weight="1" /> </LinearLayout> 

Чтобы узнать, когда макет представления завершен, возможно, я бы дал ему runnable в методе onCreate () моей активности и затем вызвал эту runnable из View.onSizeChanged (). Он должен выглядеть

 public void onCreate() { view.setLayoutRunnable(new Runnable() { @Override public void run() { //do layout stuff... } }); 

А затем сделайте следующее на ваш взгляд.

 public Runnable myRunnable; public void setLayoutRunnable(Runnable runner) { myRunnable = runner; } @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { if (w > 0 && h > 0 && (w != oldw || h != oldh)) { if (myRunnable!= null) myRunnable.run(); } } 

Надеюсь это поможет.

Я рисую изображения динамически и хотел установить размеры ImageViews LinearLayout, а затем использовать эти размеры. Поэтому мне нужно создать изображения после завершения макета.

Я использовал View.post (Runnable) в конце onCreate, а затем создал изображения в Runnable. Я немного экспериментировал и обнаружил, что onStart, onResume и onPostResume возникли перед макетом (ширина ImageView равна 0). Опубликованный Runnable был выполнен после всех из них и после макета, потому что была установлена ​​ширина.

 public void run() { // acquire the ImageView if (image.getWidth() == 0) image.post( this ); else { // create the images, initialize the ImageViews etc. } } 

Опубликованный Runnable предположительно отправляется в поток пользовательского интерфейса после процедур запуска. ImageViews запросит макеты, а запросы будут отправлены после Runnable. На всякий случай, я проверяю, что ширина была установлена, и перезагрузите Runnable, если она не указана. Как только инициализация завершена, Runnable снова не отправляется.

Когда я пытаюсь сделать горизонтально сложенные кнопки, я просто даю им layout_width of wrap_parent, но даю им layout_weight из 1.

Таким образом, все они стараются занимать столько места, сколько доступно, равномерно распределенное родительским макетом.

Пример кода будет примерно таким, и я надеюсь, что это поможет:

 <LinearLayout android:id="@+id/buttons" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/okButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="OK" android:layout_weight="1" /> <Button android:id="@+id/cancelButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Cancel" android:layout_weight="1" /> </LinearLayout> для <LinearLayout android:id="@+id/buttons" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/okButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="OK" android:layout_weight="1" /> <Button android:id="@+id/cancelButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Cancel" android:layout_weight="1" /> </LinearLayout> 

-serkan

Вы можете использовать iswindow() . Охватите его. Он будет вызван непосредственно перед onPause() .

В соответствии с жизненным циклом активности макет считается завершенным, когда onResume() . Это когда пользователю представлен экран. Таким образом, вы можете слепо делать вещи с помощью кнопок из этой функции.