Подтвердить что ты не робот

Как отправить представление назад? Как управлять программным обеспечением z-заказа?

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

Есть ли какой-либо метод, например sendToBack() или bringToBack() в Android. Если да, то кто-нибудь может мне помочь в этом.

Примечание: я не хочу управлять z-порядком по порядку размещения элементов в макете. Я хочу программно управлять z-ордером.

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

4b9b3361

Ответ 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, либо просто подвел под него представление перед ним.