安卓系统覆盖了所有视图?

你能在机器人中覆盖所有视图吗?

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

Is there a similar technique in android? I realise that the views are slightly different (there are three types (or more...) relativelayout, linearlayout and framelayout) but is there any way to just overlay a view on top of everything indiscriminately?

169925 次浏览

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

Android 支持一种 Cocoa Touch SDK 不支持的模式: 布局管理。
Layout for iPhone 意思是将所有东西都放在绝对位置(除了一些拉伸因素)。在机器人中的布局意味着孩子们将被放置在相互之间的关系中。

示例(第二个 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 从底部对到顶部等规则

根据评论更新

通常您在 onCreate中使用 setContentView(R.layout.your_layout)设置内容(它会为您膨胀布局)。你可以手动调用 setContentView(inflatedView),没有区别。

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

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

<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>

现在,任何视图你添加下线性布局与 android:id = "@+id/overlay"将出现与 重力 = 正确叠加线性布局与 android:id="@+id/Everything"

最好的方法是 视图叠加,你可以添加任何可绘制的覆盖图到任何视图,因为它的覆盖自 Android JellyBeanMR2(Api 18)。

mMyDrawable添加到 mMyView作为其覆盖层:

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

你可以使用 bringToFront:

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

I have tried the awnsers before but this did not work. 现在我只是使用了 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);
}

我刚刚想出了一个解决办法。我为此制作了一个 图书馆,以便以可重用的方式完成这项工作,这就是为什么不需要在 XML 中重新编码的原因。下面是关于如何在 爪哇咖啡科特林中使用它的文档。首先,从您希望显示覆盖-的活动初始化它

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 预览-

preview

BringToFront ()非常容易进行编程调整,如上所述。由于 stateListAnimator 的原因,我在使用按钮 z 顺序时遇到了一些麻烦。如果你最终需要通过编程来调整视图覆盖,而这些视图恰好是按钮,那么 确保在 xml 布局文件中将 stateListAnimator 设置为 null。 stateListAnimator 就是安卓系统的底层过程,当按钮被点击时,它会调整按钮的平移 Z,所以被点击的按钮最终会出现在顶部。这并不总是你想要的... 对于完整的 Z 顺序控制,这样做:

enter image description here