如何在Android上创建透明活动?

UMA*_*MAR 881 android transparent android-activity

我想在另一个活动之上创建一个透明的Activity.

我怎样才能做到这一点?

gno*_*bal 1345

在您的res/values/styles.xml文件中添加以下样式(如果您没有,请创建它.)这是一个完整的文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

(该值@color/transparent#00000000我放入res/values/color.xml文件的颜色值.您也可以@android:color/transparent在以后的Android版本中使用.)

然后将样式应用于您的活动,例如:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>
Run Code Online (Sandbox Code Playgroud)

  • 正如@Emilio所说,这将表现得像一个对话框,主要是因为`android:windowIsFloating`设置为true.删除此属性以表现得像一个普通的活动(在这种情况下,它将匹配`android:style/Theme.Translucent.NoTitleBar`) (70认同)
  • 我删除了<item name ="android:windowIsFloating"> true </ item>以进行全屏和透明活动 (37认同)
  • 大!只有一个改进:如果您使用parent ="@ android:style/Theme.Dialog",您将获得对话框的确切行为.这意味着淡入/淡出而不是滑入/滑出(如活动) (31认同)
  • 我用`<item name ="android:windowBackground"> @ android:color/transparent </ item>` (12认同)
  • 我的活动来自`AppCompatActivity`.所以`parent ="android:Theme"`崩溃了我的应用程序.我刚删除它,它就像魅力一样.谢谢! (11认同)
  • 当我在 android 4.2 设备上尝试此代码时,整个背景是黑色的,而不是透明的。有人遇到过这个问题吗? (3认同)
  • 我删除了 &lt;item name="android:windowIsFloating"&gt;true&lt;/item&gt; 以获得全屏和透明活动,如果您的活动是 AppCompactActivity 然后使用 Theme.AppCompact 如果不想要 ActionBar 然后 Theme.AppCompact.NoActionBar (3认同)
  • @ Neeta,我不明白你的要求.这是一项活动,即使它是透明的,因此它会获得自己的触摸事件.此外,在当前活动背后有一个透明的活动有什么好处?我想你可能正在寻找别的东西.您可能应该将您想要做的事情作为一个不同的问题发布. (2认同)
  • 问题是我试图在onCreate中使用this.SetTheme(..)以编程方式设置主题.对于这个特别透明的主题,这不起作用 - 你全黑了.一旦你用XML设置主题,它就可以工作了. (2认同)
  • 为什么不简单地使用 `android:style/Theme.Translucent.NoTitleBar` ? (2认同)
  • 我刚刚在 GitHub 上基于这个解决方案创建了一个简单的项目。你可以在这里查看:https://github.com/jiahaoliuliu/TransparentActivity (2认同)
  • 我得到左右边的默认保证金. (2认同)
  • 它也很有用:&lt;item name="android:backgroundDimAmount"&gt;0.9&lt;/item&gt; (2认同)
  • @Atul如果您的活动扩展了“ AppCompatActivity”,则需要使用“ parent =“ Theme.AppCompat”` (2认同)
  • windowIsTranslucent无法在8.0.0版本上运行 (2认同)
  • 如您所见,@ vishalpatel的原始答案写于2010年。令人惊讶的是,它如此成功地保持了这么多年。您为什么不发布任何适合您的答案。但是...确保它在所有仍在使用的先前版本上都可以反向使用,比方说..超过5%的人(就像我所做的那样:)。祝好运! (2认同)
  • 如果您使用 AppCompatActivity 扩展 `Theme.AppCompat.NoActionBar`,否则您将在屏幕中间看到一个指示标题的标题。 (2认同)

yan*_*nko 189

它是这样的:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Run Code Online (Sandbox Code Playgroud)

  • @ user1129443:`50%黑色应该是#7f000000`.每个分量(A,R,G,B)可以取"0-255"的值.`255的50%= 127. 127 in Hex = 7F`如何计算透明度(不透明度) (15认同)
  • @UMMA:使用一个问号通常就足够了.多个问号让那些花时间回答你问题的人认为你是在跳脸. (11认同)
  • 他们通常是@Matthias,因为他们的老板正在跳过他们的 (6认同)
  • 这种方法会在活动运行时锁定UI,但由于它设置为半透明,因此无法执行任何操作.是否有办法避免此UI锁定. (3认同)
  • 你只需添加主题就像alex已发布到清单中的活动声明一样 - 这位android:theme ="@ android:style/Theme.Translucent.NoTitleBar,每个Activity都可以为它指定半透明主题 (2认同)
  • 你能告诉我如何透明活动 50%?因为这是 100% 而我需要 50% (2认同)
  • @yanchenko不幸的是,这不是一个好的解决方案.正如Akhil所说,它锁定了用户界面! (2认同)

And*_*rey 117

使用"AppCompat"库或"Android设计支持库",它有点不同:

在styles.xml中:

<style name="Theme.AppCompat.Translucent" parent="Theme.AppCompat.NoActionBar">
    <item name="android:background">#33000000</item> <!-- Or any transparency or color you need -->
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>
Run Code Online (Sandbox Code Playgroud)

在AndroidManifest.xml中:

<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>
Run Code Online (Sandbox Code Playgroud)

  • 当我删除"android:background"时工作得很好 (4认同)
  • 去了网络搜索,点击了第一个链接,看到了5年前的橙色赞成票......当然,旧的答案不再适用.不用担心,只需滚动SO页面直到获得好票的新答案.+1.也许我会在5年后回来:) (4认同)
  • 我想你要删除`background并将你喜欢的半透明颜色放在`windowBackground`中 (2认同)

Dee*_*ami 35

在清单中声明您的活动,如下所示:

 <activity   
     android:name=".yourActivity"    
     android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
Run Code Online (Sandbox Code Playgroud)

并为您的布局添加透明背景.

  • 您需要在此活动中使用Theme.AppCompat主题(或后代). (4认同)

Jig*_*dya 27

将半透明主题分配给要在项目的Android清单文件中透明的活动:

<activity
    android:name="YOUR COMPLETE ACTIVITY NAME WITH PACKAGE"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Run Code Online (Sandbox Code Playgroud)


Cam*_*gny 15

我想补充一点,因为我也是一名新的Android开发人员.接受的答案很棒,但我遇到了一些麻烦.我不知道如何在colors.xml文件中添加颜色.这是应该怎么做:

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <color name="class_zero_background">#7f040000</color>
     <color name="transparent">#00000000</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

在我原来的colors.xml文件中,我有标签"drawable":

<drawable name="class_zero_background">#7f040000</drawable>
Run Code Online (Sandbox Code Playgroud)

所以我也为颜色做了这个,但我不明白"@ color /"引用意味着在XML中寻找标签"color".我认为我也应该提到这一点,以帮助其他人.


and*_*hay 15

我只是android:theme="@android:style/Theme.Translucent"在清单中添加了活动标签,就在2.3.3上实现了它.

关于较低版本,我不知道......

  • 如果你使用它,请不要使用`AppCompatActivity`. (6认同)

Gem*_*Gem 15

在我的情况下,我必须根据一些条件在java中设置运行时的主题.所以我创建了一个主题风格(类似于其他答案):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后在Java中我将它应用于我的活动:

@Override
    protected void onCreate(Bundle savedInstanceState) {

        String email = getIntent().getStringExtra(AppConstants.REGISTER_EMAIL_INTENT_KEY);
        if (email != null && !email.isEmpty())
        {
            // We have the valid email ID, no need to take it from user, prepare transparent activity just to perform bg tasks required for login
            setTheme(R.style.Theme_Transparent);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);

        }
        else
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_dummy);


    }
Run Code Online (Sandbox Code Playgroud)

请记住一个重点:您必须先调用该setTheme()功能super.onCreate(savedInstanceState);.我错过了这一点并且坚持了2个小时,想到为什么我的主题没有在运行时反映出来.


Fat*_*tie 8

2021年事实

只需添加

<item name="android:windowBackground">@android:color/transparent</item>
Run Code Online (Sandbox Code Playgroud)

你完成了。

windowIsFloating 错了,这会产生一个 INSET 浮动窗口。

windowContentOverlay 只与阴影有关。

windowIsTranslucent错了,它没有做到,所以你可以看到后面的活动。windowIsTranslucent 仅与动画过渡相关。

backgroundDimEnabled使下面的活动变暗,但是,它在不同的设备上完全有问题。(在某些情况下,除非您使用 windowIsFloating,否则它什么都不做;一般来说,行为完全是错误的/不确定的。)

colorBackgroundCacheHint 除了在非常旧的设备上是无关紧要的,无论如何默认值为空。

  • “非常旧的设备” - 写于 10 年前,距 Android 推出仅 2 年。我想从 2011 年到 2021 年的设备必须被认为是“古老的”。哈哈 (2认同)

小智 7

只需让活动背景图片透明即可.或者在XML文件中添加主题:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Run Code Online (Sandbox Code Playgroud)


Lee*_*dev 7

onCreate函数中,在setContentView下面添加以下行:

getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Run Code Online (Sandbox Code Playgroud)

  • 由于某种原因使背景完全变黑. (21认同)

小智 6

我找到的最简单的方法是将AndroidManifest中的活动主题设置为android:theme="@android:style/Theme.Holo.Dialog".

然后在activity的onCreate方法中,调用getWindow().setBackgroundDrawable(new ColorDrawable(0));.


Zaf*_*glu 6

除了上述答案:

避免 android Oreo 相关的活动崩溃

<style name="AppTheme.Transparent" parent="@style/Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowCloseOnTouchOutside">false</item>
</style>

<activity
     android:name="xActivity"
     android:theme="@style/AppTheme.Transparent" />
Run Code Online (Sandbox Code Playgroud)

  • 截至2018年,这应该是**最佳答案** (2认同)

Pav*_*kin 5

对于对话框活动,我使用以下代码:

getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);
Run Code Online (Sandbox Code Playgroud)

但是,您还需要将活动中的主视图设置为不可见。否则,背景将是不可见的,而其中的所有视图都将是可见的。

  • 使背景完全变黑 (6认同)

Zoh*_*Ali 5

如果您正在使用,AppCompatActivity请将其添加到styles.xml

<style name="TransparentCompat" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>
Run Code Online (Sandbox Code Playgroud)

manifest文件中,您可以将此主题添加到活动标签中,如下所示

android:theme="@style/TransparentCompat"
Run Code Online (Sandbox Code Playgroud)

欲了解更多详细信息,请阅读这篇文章