如何发送视图回来?如何以编程方式控制z顺序?

时间:2011-07-20 08:26:49

标签: android android-layout view z-order

我有一个问题是将视图发送回来。在Android中,我们有一个像bringToFront()这样的方法,将视图放在另一个视图的顶部。就像那样,我想把视图放在上一张图片的下方。

Android中是否有sendToBack()bringToBack()等方法。如果是这样,任何人都可以帮助我。

注意:我不想按照在布局中放置项目的顺序来控制z顺序我想以编程方式控制z顺序。

我不想隐藏前面的视图我只是希望它们在移动的视图后面。

13 个答案:

答案 0 :(得分:62)

我意识到这已经隐含在其他答案中,但没有人发布代码。我在实用程序类中保留以下内容,其中我有“帮助”函数来处理视图:

public static void sendViewToBack(final View child) {
    final ViewGroup parent = (ViewGroup)child.getParent();
    if (null != parent) {
        parent.removeView(child);
        parent.addView(child, 0);
    }
}

答案 1 :(得分:38)

没有sendToBack()方法。但是如果你在较低位置的视图上调用bringToFront(),你会得到几乎相同的效果。

答案 2 :(得分:31)

Afaik没有针对此的内置解决方案。我猜你试图修改FrameLayout中的z顺序,或类似的东西。

但是,我认为您可以修改布局中包含的子元素的顺序。 RemoveChild ...()和addView()方法可以获取位置值,因此您很可能会交换子元素,这将修改z顺序。然而,这似乎有点讨厌。

或者考虑修改子视图的可见性属性,您可能会得到类似的行为,而且我认为这会更清晰。

修改

使用新的Android版本,L Developer Preview似乎终于可以轻松更改视图的Z顺序。救援中的“海拔”和“翻译Z”属性:https://developer.android.com/preview/material/views-shadows.html

答案 3 :(得分:19)

在您想要获取的视图上调用bringToFront(),然后在所有视图上调用invalidate()方法,包括前面所需的视图。对所有听众重复相同的事情。

因此,当另一个视图的侦听器被调用时,前一个视图将失效并且将在后台。

答案 4 :(得分:8)

以下是我用来向后面发送视图的方法(与bringToFront相反,类似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));
        }
    }

希望这有帮助!

答案 5 :(得分:2)

请注意,您可以从API级别21开始使用view.setZ(float)Here您可以找到更多信息。

答案 6 :(得分:2)

它的工作原理就像bringToBack()

http

答案 7 :(得分:1)

您还可以尝试使用ViewGroup.addViewInLayout()方法的功能来获取索引,确定视图是在列表的末尾还是在列表的开头

答案 8 :(得分:1)

在XML文件中,您必须按顺序编写:

<FrameLayout
android:id="@+id/frameLayoutXML"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
<ImageView
 android:id="@+id/imageViewXML"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/floatB_XML"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</FrameLayout>

在这种情况下,imageView将位于FloatingActionButton的后面。

如果您想更改某些内容,并且可以通过编程方式进行,则:

public class SomeActivity extends AppCompatActivity {

    //declare variables
    ImageView imageView;
    FrameLayout frameLayout;
    FloatingActionButton floatingActionButtonNew;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //Here is to call what already exists at XML file
        frameLayout=findViewById(R.id.frameLayoutXML);   
        imageView = findViewById(R.id.imageViewXML);
        //Here is to declare a new Element to add to the view, but is not at XML File
        floatingActionButtonNew=New FloatingActionButton(this);
        frameLayout.removeAllViews();  //here you remove all views.
        frameLayout.addView(imageView);//And you add again the imageView first
        floatingActionButtonNew.setLayoutParams(new 
         RelativeLayout.LayoutParams(
          RelativeLayout.LayoutParams.WRAP_CONTENT,
          RelativeLayout.LayoutParams.WRAP_CONTENT
        )); //Then you can give some format to your floatingButtonNew

        //And finally  add to the frameLayout the new View in this case the floatingButtonNew
        frameLayout.addView(floatingActionButtonNew);
    }
}

按照这种视图声明的顺序,您将再次从浮动按钮获得图像。因此,首先声明的视图将从第二次声明的视图返回,而实现顺序的关键是到达removeAllViewsFrameLayout的{​​{1}}以编程方式添加时的视图。

答案 9 :(得分:1)

如果有问题的视图是按钮,则程序化调整需要一行 xml 来实现完整的 z 顺序控制。否则,setElevation()、setZ()、setTranslationZ() 和 BringToFront() 都会莫名其妙地让你失望。请参阅下面单独线程的说明。

https://stackoverflow.com/a/68674834/14116101

答案 10 :(得分:0)

I would either set it's visibility to 0 or just bring the view under it in front of it.

答案 11 :(得分:0)

如果您正在使用appCompat库,那么还有另一种方法可以更改低于21 API级别的设备的Z顺序:

ViewCompat.setTranslationZ(view, zValue);

答案 12 :(得分:-1)

您可以尝试view.setVisibility(View.INVISIBLE)view.setVisibility(View.GONE)

<强>更新

This向您展示如何完成您想要做的事情。