Уже есть разные действительные ответы, но, похоже, ни один из них не дает правильного представления о том, какой метод (ы) использовать в каком случае, за исключением соответствующих ограничений уровня API:
Если вы можетедождитесь цикла компоновки, и родительская группа представлений поддерживает MarginLayoutParams
(или подкласс), установите marginLeft
/ marginTop
соответственно.
Если вам нужно немедленно изменить позициюи постоянно (например, для привязки PopupMenu), дополнительно вызовите layout(l, t, r, b)
с теми же координатами.Это опережает то, что система макета подтвердит позже.
Для немедленных (временных) изменений (например, анимации) используйте setX()
/ setY()
.В случаях, когда размер родительского элемента не зависит от WRAP_CHILDREN, может быть целесообразно использовать исключительно setX()
/ setY()
.
Никогда использовать setLeft()
/ setRight()
/ setBottom()
/ setTop()
, см. Ниже.
Фон : mLeft
/ mTop
/ mBottom
/mRight
поля заполняются из соответствующих LayoutParams в layout ().Макет вызывается неявно и асинхронно системой макетов представления Android.Таким образом, установка MarginLayoutParams
представляется наиболее безопасным и чистым способом постоянной установки позиции.Однако асинхронная задержка компоновки может быть проблемой в некоторых случаях, например, при использовании View для визуализации курсора, и он должен быть перемещен и одновременно служить якорем PopupMenu.В этом случае вызов layout()
работал нормально для меня.
Проблемы с setLeft()
и setTop()
:
Недостаточно одного их вызова - вам также нужно позвонить setRight()
и setBottom()
чтобы избежать растяжения или сжатия представления.
Реализация этих методов выглядит относительно сложной (= выполнение некоторой работы для учета изменений размера представления, вызванных каждым из них)
Кажется, они вызывают странные проблемы с полями ввода: Мягкая цифровая клавиатура EditText иногда не позволяет вводить цифры
setX()
и setY()
работают вне системы макетов, и соответствующие значения обрабатываются как дополнительное смещение к левому / верхнему / нижнему / правому значению, определенному системой макетов, соответственно смещая вид.Похоже, они были добавлены для анимации (где требуется немедленный эффект без прохождения цикла макета).