Как отправить представление назад? Как управлять программным обеспечением z-заказа?
У меня есть проблема, чтобы отправить представление назад. В Android у нас есть метод, подобный bringToFront()
, чтобы разместить представление поверх другого представления. Таким образом, я хочу поместить представление ниже предыдущего изображения.
Есть ли какой-либо метод, например sendToBack()
или bringToBack()
в Android. Если да, то кто-нибудь может мне помочь в этом.
Примечание: я не хочу управлять z-порядком по порядку размещения элементов в макете. Я хочу программно управлять z-ордером.
Я не хочу скрывать представления на фронте, я просто хочу, чтобы они были за движущимся видом.
Ответы
Ответ 1
Afaik нет для этого встроенного решения. Я думаю, вы пытаетесь изменить z-порядок в FrameLayout или что-то подобное.
Однако, я думаю, вы можете изменить порядок содержащихся дочерних элементов в макете. Методы RemoveChild...() и addView() могут принимать значения позиции, поэтому вы, скорее всего, могли бы менять дочерние элементы вокруг, и это изменило бы z-порядок. Тем не менее, это похоже на хакерское решение.
Или рассмотрите возможность изменения свойства видимости дочерних представлений, вы можете получить подобное поведение, и я думаю, что это будет намного чище.
Edit:
С новой версией Android, L Developer Preview, кажется, что, наконец, у нас есть возможность легко изменить Z-упорядочение просмотров. Свойства "Elevation" и "TranslationZ" для спасения: https://developer.android.com/preview/material/views-shadows.html
Ответ 2
Я понимаю, что это подразумевалось в других ответах, но никто не отправил код. Я сохраняю следующее в классе утилиты, где у меня есть "вспомогательные" функции для работы с представлениями:
public static void sendViewToBack(final View child) {
final ViewGroup parent = (ViewGroup)child.getParent();
if (null != parent) {
parent.removeView(child);
parent.addView(child, 0);
}
}
Ответ 3
Нет метода sendToBack()
. Но если вы вызываете bringToFront()
в нижнем позиционном представлении, вы получаете почти тот же эффект.
Ответ 4
Вызвать bringToFront()
в представлении, которое хотите получить спереди, а затем вызвать метод invalidate()
для всего представления, включая представление, которое вы хотите в начале. Повторите то же самое для всех слушателей.
Поэтому, когда будет вызван другой прослушиватель, предыдущее представление будет признано недействительным и будет в фоновом режиме.
Ответ 5
Вот метод, который я использую, чтобы отправить представление в обратную сторону (так противоположно totoTrotect, вроде sendToBack):
private void moveToBack(View myCurrentView)
{
ViewGroup myViewGroup = ((ViewGroup) myCurrentView.getParent());
int index = myViewGroup.indexOfChild(myCurrentView);
for(int i = 0; i<index; i++)
{
myViewGroup.bringChildToFront(myViewGroup.getChildAt(i));
}
}
Надеюсь, это поможет!
Ответ 6
Обратите внимание, что вы можете использовать view.setZ(float)
, начиная с уровня API 21. Здесь вы можете найти дополнительную информацию.
Ответ 7
Вы также можете попытаться использовать функциональность метода ViewGroup.addViewInLayout()
, который принимает индекс, определяя, должно ли представление быть в конце или в начале списка
Ответ 8
он отлично работает, как bringToBack()
public void moveToBack(ViewGroup viewGroup, View v) {
int s = 1;
for (int i = 1; i < viewGroup.getChildCount(); i++) {
if (viewGroup.getChildAt(1) == v) {
s = 2;
} else {
viewGroup.getChildAt(s).bringToFront();
}
}
}
Ответ 9
Вы можете попробовать сделать view.setVisibility(View.INVISIBLE)
или view.setVisibility(View.GONE)
.
UPDATE:
В этом показано, как выполнить то, что вы хотите сделать.
Ответ 10
Я бы либо установил видимость на 0, либо просто подвел под него представление перед ним.