Android覆盖了一切视图?

时间:2011-09-22 17:47:39

标签: java android layout view

你可以在Android的所有内容上叠加视图吗?

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

Android中是否有类似的技术?我意识到视图略有不同(有三种类型(或更多......)relativelayout,linearlayout和framelayout)但是有没有办法只是在一切上叠加一个视图?

6 个答案:

答案 0 :(得分:94)

只需使用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必须对齐底部到顶部

根据评论进行更新

通常您在setContentView(R.layout.your_layout)中使用onCreate设置内容(它会为您的布局充气)。您可以手动执行此操作并致电setContentView(inflatedView),但没有区别。

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

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

答案 1 :(得分:15)

<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" 添加的任何视图将在线性布局上显示为 gravity = right 的叠加,其中 android:id="@+id/Everything"

答案 2 :(得分:9)

您可以使用bringToFront

    View view=findViewById(R.id.btnStartGame);
    view.bringToFront();

答案 3 :(得分:0)

我之前尝试过这些芒果,但这不起作用。 现在我jsut使用了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);
            }

答案 4 :(得分:0)

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

const key = k as keyof T;

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

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

Gif预览-

Kotlin

答案 5 :(得分:0)

bringToFront() 非常容易进行程序化调整,如上所述。由于 stateListAnimator,我在使用按钮 z 顺序时遇到了一些麻烦。如果您最终需要以编程方式调整视图叠加层,而这些视图恰好是按钮,请确保在您的 xml 布局文件中将 stateListAnimator 设置为 null。 stateListAnimator 是 android 的底层调整过程单击按钮时按钮的 translationZ,因此单击的按钮最终会显示在顶部。这并不总是您想要的...对于完整的 Z 顺序控制,请执行以下操作:

enter image description here