我有一个问题是将视图发送回来。在Android中,我们有一个像bringToFront()
这样的方法,将视图放在另一个视图的顶部。就像那样,我想把视图放在上一张图片的下方。
Android中是否有sendToBack()
或bringToBack()
等方法。如果是这样,任何人都可以帮助我。
注意:我不想按照在布局中放置项目的顺序来控制z顺序我想以编程方式控制z顺序。
我不想隐藏前面的视图我只是希望它们在移动的视图后面。
答案 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);
}
}
按照这种视图声明的顺序,您将再次从浮动按钮获得图像。因此,首先声明的视图将从第二次声明的视图返回,而实现顺序的关键是到达removeAllViews
或FrameLayout
的{{1}}以编程方式添加时的视图。
答案 9 :(得分:1)
如果有问题的视图是按钮,则程序化调整需要一行 xml 来实现完整的 z 顺序控制。否则,setElevation()、setZ()、setTranslationZ() 和 BringToFront() 都会莫名其妙地让你失望。请参阅下面单独线程的说明。
答案 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)