Android将视图叠加在所有内容之上?


75

您可以在android的所有内容之上叠加视图吗?

在iPhone中,我将新视图设置frame.origin为(0,0)并将其宽度和高度设置为的宽度和高度self.viewself.view然后,将其添加到图层将使其充当覆盖层,覆盖其后的内容(或者如果其具有透明背景,则显示其后的视图)。

android中有类似的技术吗?我意识到视图略有不同(相对布局,线性布局和框架布局有三种(或更多)类型,但是有什么方法可以不加选择地将视图叠加在所有内容之上吗?

Answers:


101

只需使用RelativeLayoutFrameLayout。最后一个子视图将覆盖其他所有内容。

Android支持Cocoa Touch SDK不支持的模式:布局管理。iPhone的
布局意味着将所有内容都放置在绝对位置(除了一些拉力因素之外)。android中的布局意味着孩子将彼此相对放置。

示例(第二个EditText将完全覆盖第一个):

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/root_view">

    <EditText
        android:layout_width="fill_parent"
        android:id="@+id/editText1"
        android:layout_height="fill_parent">
    </EditText>

    <EditText
        android:layout_width="fill_parent"
        android:id="@+id/editText2"
        android:layout_height="fill_parent">
        <requestFocus></requestFocus>
    </EditText>

</FrameLayout>

FrameLayout是某种视图栈。专为特殊情况而设计。

RelativeLayout非常强大 您可以定义规则,例如视图A必须将父布局的底部对齐视图B必须将A的底部与顶部对齐,等等。

根据评论更新

通常,您使用setContentView(R.layout.your_layout)in设置内容onCreate(它将为您增加布局)。您可以手动进行操作并致电setContentView(inflatedView),没有区别。

视图本身可以是单个视图(如TextView),也可以是复杂的布局层次结构(嵌套布局,因为所有布局都是视图本身)。

调用setContentView活动后,便知道其内容是什么样的,并且可以(FrameLayout) findViewById(R.id.root_view)用来检索此层次结构中的任何视图(常规模式(ClassOfTheViewWithThisId) findViewById(R.id.declared_id_of_view))。


谢谢你的例子。所以我猜在一个活动中,内容视图可能是一个框架布局?如果我使用A从布局xml文件中layoutinflater抓取A relativelayout,如何将其添加到内容视图中?有没有办法获得对内容视图的引用?谢谢
Thomas Clayson

我更新了答案,因此它解释了活动的内容是什么以及如何与之交互。
Knickedi 2011年

辉煌。非常感谢你。:)
Thomas Clayson

1
我想指出的是,尽管我更喜欢FrameLayout它的轻量特性,但是如果身高过高,它无法将最大测量高度(也就是它自己的最终高度)传播给孩子match_parent请参见此处。因此,在支持Android 2并使用时match_parentRelativeLayout它是唯一的选择。有关示例,请参见此处
类堆叠器

杰斐依(JFYI):在Android 4.4.4上,足以将片段作为覆盖放置。从Android 5.0开始,某些元素(例如按钮和卡片视图)放在顶部。有了答案中的解决方案,它就像一个魅力。
2015年

16
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
    android:id = "@+id/Everything"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- other actual layout stuff here EVERYTHING HERE -->

   </LinearLayout>

<LinearLayout
    android:id="@+id/overlay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right" >
</LinearLayout>

现在,您在LinearLayout下添加的任何视图都将在重力=右的情况android:id = "@+id/overlay"显示为Linear Layout android:id="@+id/Everything"



9

最好的方法是ViewOverlay,自Android JellyBeanMR2(Api 18)开始,您可以将任何drawable作为叠加层添加到任何视图作为其叠加层。

添加mMyDrawablemMyView它的覆盖:

mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight())
mMyView.getOverlay().add(mMyDrawable)

错字:mMyDrawable.setBounds
yk4ever

感谢您的解决方案。但是您可以从图像访问视图组件。例如,如果单击图像后视图中有一个按钮,则原始视图按钮将被自动单击。
兰吉斯·苏布拉马尼亚姆

@RanjithSubramaniam是的,因为它只是在视图上绘制的可叠加绘制的。
Jacks Gong

但是,如果必须将视图放置在另一个视图之上,这是
行不通的

0

我之前曾尝试过遮阳篷,但这没有用。现在,我使用了LinearLayout而不是TextureView,现在它可以正常工作了。希望它可以帮助其他有相同问题的人。:)

    view = (LinearLayout) findViewById(R.id.view); //this is initialized in the constructor
    openWindowOnButtonClick();

public void openWindowOnButtonClick()
{
    view.setAlpha((float)0.5);
    FloatingActionButton fb = (FloatingActionButton) findViewById(R.id.floatingActionButton);
    final InputMethodManager keyboard = (InputMethodManager) getSystemService(getBaseContext().INPUT_METHOD_SERVICE);
    fb.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            // check if the Overlay should be visible. If this value is false, it is not shown -> show it.
            if(view.getVisibility() == View.INVISIBLE)
            {
                view.setVisibility(View.VISIBLE);
                keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                Log.d("Overlay", "Klick");
            }
            else if(view.getVisibility() == View.VISIBLE)
            {
                view.setVisibility(View.INVISIBLE);
                keyboard.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
            }

1
我认为,要使这成为一个非常有用的答案,您应该添加一些内容。示例代码,屏幕截图,...
GhostCat

0

我刚刚提出了解决方案。我为此创建了一个来以可重用的方式做到这一点,这就是为什么您不需要在XML中重新编码的原因。这是有关如何在JavaKotlin中使用它的文档。首先,从您要显示叠加层的活动中对其进行初始化-

AppWaterMarkBuilder.doConfigure()
                .setAppCompatActivity(MainActivity.this)
                .setWatermarkProperty(R.layout.layout_water_mark)
                .showWatermarkAfterConfig();

然后,您可以在应用中的任何位置隐藏和显示它-

  /* For hiding the watermark*/
  AppWaterMarkBuilder.hideWatermark() 

  /* For showing the watermark*/
  AppWaterMarkBuilder.showWatermark() 

Gif预览-

预习

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.