如何在Android上创建一个透明的Activity?

1016

我想在另一个Activity之上创建一个透明的Activity。

我该如何实现这一目标?


你能告诉我们透明活动的用途是什么吗? - Mohamed Ben Romdhane
25个回答

1484

在您的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>

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

然后将该样式应用于您的Activity,例如:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>

13
我使用了<item name="android:windowBackground">@android:color/transparent</item>这段代码。 - Someone Somewhere
36
好的!只需要一个改进: 如果使用parent="@android:style/Theme.Dialog",你会得到完全像对话框一样的表现。这意味着它会淡入淡出而不是滑入滑出(就像一个活动) - PakitoV
78
如@Emilio所述,这将表现为对话框,主要是因为将android:windowIsFloating设置为true。删除此属性以表现为普通活动(在这种情况下,它将匹配android:style/Theme.Translucent.NoTitleBar)。 - aromero
41
为了实现全屏透明的活动页面,我删除了 <item name="android:windowIsFloating">true</item>。 - Kevin Duong
18
我的活动是从AppCompatActivity派生而来的。所以parent="android:Theme"导致我的应用程序崩溃。我只是把它移除了,就像魔法一样解决了问题。谢谢! - Atul
显示剩余28条评论

206

它是这样的:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />

3
你只需要在清单文件的活动声明中添加阿历克斯发布的主题 - 这一部分是 android:theme="@android:style/Theme.Translucent.NoTitleBar",你可以为每个活动指定透明主题。 - Donal Rafferty
3
你能告诉我如何将活动透明度调整为50%吗?因为当前是100%,但我需要50%。 - Nikunj Patel
17
"50%黑色应为#7f000000"。每个组成部分(A,R,G,B)可以取值从0到255。 "255的50%=127。 16进制数127 = 7F" 这就是计算透明度的方法。 - Trung Nguyen
6
这种方法在活动运行时会有点锁定界面的感觉,但由于它被设置为半透明,所以无法进行任何操作。是否有避免界面锁定的方法? - Akhil Latta
4
很抱歉,这不是一个好的解决方案。正如Akhil所说,它会锁定用户界面! - likejudo
显示剩余3条评论

151

在 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>
在 AndroidManifest.xml 文件中:
<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>

1
如果您计划在此Activity上实际显示某些内容(例如对话框或DialogFragment),则会注意到所有内容都是暗色主题。因此,您可能希望您的主题从Theme.Appcompat.Light.NoActionBar继承。 - tir38
1
在我的情况下,它显示黑色背景。我已经设置了父主题为其他内容,但在特定的活动中,我正在按照所述更改主题。有什么帮助吗? - Abdul Waheed
4
删除 "android:background" 后,运行效果很好。 - Oded Breiner
2
我认为你想要移除 background 并在 windowBackground 中放置你喜欢的半透明颜色。 - hmac
如果您的活动使用AppCompatActivity,那么这应该是答案,与@gnobal的答案相反。 - Marvin

39

请在清单文件中像这样声明您的活动:

 <activity   
     android:name=".yourActivity"    
     android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>

并将透明背景添加到您的布局。


7
你需要在这个活动中使用Theme.AppCompat主题(或其子类)。 - Puni

29

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

<activity
    android:name="YOUR COMPLETE ACTIVITY NAME WITH PACKAGE"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

这会导致 IllegalStateException: 您需要在此活动中使用 Theme.AppCompat 主题(或其子主题)。 - Arpit J.

19

在我的情况下,我需要根据一些条件在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>

然后我在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);
}

在这里记住一个重要的观点:您必须在super.onCreate(savedInstanceState);之前调用setTheme()函数。我错过了这一点,卡了两个小时,才想到为什么我的主题在运行时没有反映。


1
java.lang.IllegalStateException: 您需要在此活动中使用Theme.AppCompat主题(或其子类)。 - Grégori Fernandes de Lima

18

2021事实

只需添加

<item name="android:windowBackground">@android:color/transparent</item>

你完成了。

windowIsFloating 错误,这将使内嵌浮动窗口。

windowContentOverlay 只涉及阴影。

windowIsTranslucent 是错误的,它并没有让你看到后面的活动。windowIsTranslucent 只在动画过渡中有意义。

backgroundDimEnabled 会使下方的活动变暗,但是在不同设备上完全存在 bug(例如,在某些情况下,除非您使用 windowIsFloating,否则不起作用;通常行为完全存在 bug/不确定性)。

colorBackgroundCacheHint 只在极老的设备上才相关,而默认值是 null。


3
“极其老旧的设备”- 这段文字是在安卓推出后仅两年写下的,现在2021年,2011年发布的设备可以被认为是“古董”了。哈哈。 - Johann
你的解决方案实际上并没有做到这件事。被接受的答案已经有10年了,但它仍然有效...只需要扩展AppCompat主题而不是Theme即可。 - Andranik
1
接受的答案是相当错误的,原因在这里的五个要点中有所解释。(您可以简单地阅读每个要点的文档以获取事实。) - Fattie
没有起作用,窗口最终出现了黑色背景。 - htafoya
@htafoya,我不知道为什么它对某些人无效。在Android中,您可以以各种主题和设置的方式“启动”项目,所以很遗憾我不能确定,我认为也没有人能确定;其他方法对其他人起作用(或不起作用)这一事实也是由于众多原因。Android很难:/尽管如此,在这里提到的五个要点(直接来自最近的文档)是确凿无疑的。 - Fattie
不好意思,这与主题名称没有扩展Theme有关。 - htafoya

16

我也是一个新的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>

在我的原始colors.xml文件中,我有一个名为“drawable”的标签:

<drawable name="class_zero_background">#7f040000</drawable>

所以我对颜色也这样做了,但我不明白“@color/”引用的意思是在XML中查找“color”标签。 我认为我应该提一下这一点,以帮助其他人。


16

我在2.3.3上通过在清单文件中的activity标签中添加android:theme="@android:style/Theme.Translucent"就实现了它。

我不知道更低版本的情况...


这对2.2也适用。我刚刚创建了一个简单的活动,其中包含一个列表视图,并且它浮在上一个活动之上。 - slott
它在API 1中被添加,这不是问题 :) - xmen
7
如果您正在使用此功能,请勿使用AppCompatActivity - zackygaurav
它也适用于7.0,所以这是一个好方法。我将其修改为@android:style/Theme.Translucent.NoTitleBar.Fullscreen。 - Piyush-Ask Any Difference

9
onCreate函数中,在setContentView下面添加这一行:
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

26
出于某种原因,将背景完全变为黑色。 - C--
我的也是 @SubinSebastian,有人找到解决方法了吗? - finnmglas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接