我有一个问题,想把一个视图置于底部。在Android中,我们有一个类似于bringToFront()
的方法,可以将视图放在另一个视图的顶部。就像这样,我想将视图放在之前的图片下面。
在Android中是否有类似于sendToBack()
或bringToBack()
的方法?如果有,能否帮忙提供一下。
注意:我不想通过布局中项目的放置顺序来控制z-order,我想以编程方式控制z-order。
我不想隐藏前面的视图,我只想让它们在移动的视图后面。
我有一个问题,想把一个视图置于底部。在Android中,我们有一个类似于bringToFront()
的方法,可以将视图放在另一个视图的顶部。就像这样,我想将视图放在之前的图片下面。
在Android中是否有类似于sendToBack()
或bringToBack()
的方法?如果有,能否帮忙提供一下。
注意:我不想通过布局中项目的放置顺序来控制z-order,我想以编程方式控制z-order。
我不想隐藏前面的视图,我只想让它们在移动的视图后面。
我意识到其他答案中已经暗示了这一点,但是没有人发布过代码。我将以下代码保留在一个实用程序类中,在那里我有用于处理视图的“helper”函数:
public static void sendViewToBack(final View child) {
final ViewGroup parent = (ViewGroup)child.getParent();
if (null != parent) {
parent.removeView(child);
parent.addView(child, 0);
}
}
没有sendToBack()
方法。但是,如果您在低位置视图上调用bringToFront()
,几乎可以获得相同的效果。
据我所知,这方面没有内置的解决方案。我猜你是想修改 FrameLayout 中的 Z 轴顺序或者类似的东西。
然而,我认为你可以修改布局中包含的子元素的顺序。removeChild...() 和 addView() 方法可以带有位置值,因此你可以交换子元素的位置,从而修改 Z 轴顺序。但是这似乎是一种比较 hacky 的解决方案。
或者考虑修改子视图的可见性属性,你可能会得到类似的效果,并且更加清晰简洁。
编辑:
在新版本的 Android(即 L Developer Preview)中,似乎终于可以轻松地更改 View 的 Z 轴顺序了。'Elevation' 和 'TranslationZ' 属性来拯救: https://developer.android.com/preview/material/views-shadows.html
bringToFront()
。首先,你必须使用 removeAllViews()
或 setVisibility(View.GONE)
或类似的方法。然后才能使用 addView()
或 setVisibility(View.Visible)
将子视图带回来。 - AlexAndro调用bringToFront()
方法使要置于前台的视图处于最前面,然后调用所有视图(包括要置于前台的视图)的invalidate()
方法。对所有监听器重复此过程。
因此,当另一个视图的监听器被调用时,先前的视图将被使无效并移到后台。
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));
}
}
它像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();
}
}
}
<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);
}
}
在这些视图声明的顺序中,您将再次从浮动按钮获得图像。因此,首先声明的视图将回到第二个声明的视图,而实现顺序的关键是使用FrameLayout
或LinearLayout
的removeAllViews
方法,然后在编程添加视图时再次添加这些视图。
ViewCompat.setTranslationZ(view, zValue);
您还可以尝试使用ViewGroup.addViewInLayout()
方法的功能,该方法接受一个索引,确定视图应该位于列表的末尾还是开头
add()
)。如果您想尝试,请随意。或者通过查看源代码来确认它……它在内部使用addInArray()方法。但是您关于文档不清楚是正确的。因此,如果您使用它,可能应该在将来的API更新中注意此问题,以防他们决定更改此未记录的行为。好观点。 - Turixparent
是一个LinearLayout
,则无论之前的顺序如何,child
都将成为第一个;在Marshmallow 6.0.1上进行了尝试。 - Attacktive