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


Answers:


1392

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#00000000我放入res/values/color.xml文件中的颜色值。您也可以@android:color/transparent在更高版本的Android中使用。)

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

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

13
我曾经用过<item name="android:windowBackground">@android:color/transparent</item>
某处某人

33
大!只是一项改进:如果使用parent =“ @ android:style / Theme.Dialog”,您将获得对话框的确切行为。这意味着淡入/淡出而不是滑入/滑出(如活动)
PakitoV 2011年

73
正如@Emilio所提到的,这将像对话框一样,主要是因为android:windowIsFloating设置为true。删除此属性,使其表现得像正常活动(在这种情况下,它将匹配android:style/Theme.Translucent.NoTitleBar
aromero 2012年

38
我删除了<item name =“ android:windowIsFloating”> true </ item>进行全屏透明活动
Kiem Duong

12
我的活动来自AppCompatActivity。所以parent="android:Theme"崩溃了我的应用程序。我刚刚将其删除,它就像魅力一样工作。谢谢!
Atul 2016年

193

它是这样的:

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

3
您只需添加alex已发布到清单中的活动声明中的主题-此位android:theme =“ @ android:style / Theme.Translucent.NoTitleBar,对于每个活动,您都可以为其分配半透明主题
Donal Rafferty

12
@UMMA:使用一个问号通常就足够了。多个问号使那些花时间回答您的问题的人认为您正在面对他们。
马提亚斯(Matthias)

7
他们通常是@Matthias,因为他们的老板在他们的老板面前跳来跳去
Reno

16
@ user1129443 :50% black should be #7f000000。每个分量(A,R,G,B)都可以取的值0-25550% of 255 = 127. 127 in Hex = 7F那如何计算透明度(opacity)
Nam Trung 2012年

4
这种方法会在活动运行时锁定UI,但是由于将其设置为半透明,因此无法执行任何操作。有没有一种方法可以避免UI锁定。
Akhil Latta

126

在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上显示某些内容(例如Dialog或DialogFragment),则会注意到所有内容都是以Dark为主题的。因此,您可能希望主题继承自Theme.Appcompat.Light.NoActionBar
tir38

1
在我的案例中,它显示为黑色背景。我为父主题设置了其他内容,但在一项特定活动中,我正在更改主题(如前所述)。有帮助吗?
Abdul Waheed

4
当我删除“ android:background”时效果很好
Oded Breiner

2
我认为您想删除background您喜欢的半透明颜色并将其放入windowBackground
hmac

如果您的活动正在使用AppCompatActivity,而不是@gnobal的答案,那么这应该是答案。
AeroEchelon

37

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

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

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


最好的办法。感谢
Peter

5
您需要在此活动中使用Theme.AppCompat主题(或后代)。
普尼

28

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

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

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

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

我不知道较低的版本...


这对于2.2也很好。我刚刚创建了一个带有列表视图的简单活动,它浮动在上一个活动的顶部。
老虎机2012年

它是在API 1中添加的,这不是问题:)
xmen 2014年

6
不要使用AppCompatActivity,如果你用这个。
zackygaurav

也可以在7.0中使用,因此它是一种很好的方法。我将其修改为@android:style / Theme.Translucent.NoTitleBar.Fullscreen
Sandeep

16

就我而言,我必须根据某些条件在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);
}

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


9

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

getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

23
由于某种原因使背景完全变为黑色。
Subin Sebastian 2015年

我也是@SubinSebastian,有人找到解决方案吗?
Finnmglas

8

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

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

7

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

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


6

对于对话框活动,我使用以下命令:

getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);

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


2
使背景完全
变为

5

除了以上答案:

避免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" />

2
截至2018年,这应该是最佳答案
Geek Guy'Oct

在API 28模拟器上给了我黑色背景
某处某人

我尝试解决此问题,以解决与android 8.0中的设置方向相关的崩溃,但是我仍然收到IllegalStateException:仅全屏不透明活动请求方向
Rahul Sahni

3

我只做了两件事,这使我的活动变得透明。他们在下面。

  1. 在清单文件中,我只是将以下代码添加到了活动标签中。

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. 我只是将该活动的主要布局背景设置为“ #80000000 ”。喜欢

    android:background="#80000000"

它对我来说完美。


3

如果您正在使用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>

manifest文件中,您可以像这样将主题添加到活动标签

android:theme="@style/TransparentCompat"

有关更多详细信息,请阅读本文


2

为它分配半透明主题

android:theme="@android:style/Theme.Translucent.NoTitleBar"

2

有两种方法:

  1. 使用Theme.NoDisplay
  2. 使用Theme.Translucent.NoTitleBar

使用Theme.NoDisplay仍然可以使用,但只能在较旧的Android设备上使用。在Android 6.0及更高版本,使用Theme.NoDisplay而不调用finish()onCreate() (or, technically, before onResume())崩溃您的应用程序。这就是为什么要使用该建议的原因Theme.Translucent.NoTitleBar,而不受此限制。”


1

注意1:在Drawable文件夹中创建test.xml并复制以下代码

   <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke android:width="2dp" />

    <gradient
        android:angle="90"
        android:endColor="#29000000"
        android:startColor="#29000000" />

    <corners
        android:bottomLeftRadius="7dp"
        android:bottomRightRadius="7dp"
        android:topLeftRadius="7dp"
        android:topRightRadius="7dp" />

</shape>

//注意:角和形状是根据您的要求。

//注意2:创建xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/test"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1.09"
            android:gravity="center"
         android:background="@drawable/transperent_shape"
            android:orientation="vertical" >
     </LinearLayout>
    </LinearLayout>

0

只需将以下行添加到清单文件中需要透明的活动标签中即可。

android:theme="@android:style/Theme.Translucent"

0

所有这些答案可能令人困惑,“透明”活动和“无UI”活动之间存在差异。

使用这个:

android:theme="@android:style/Theme.Translucent.NoTitleBar"

将使活动透明,但将阻止UI。

如果您想要一个None UI活动而不是使用以下方法:

android:theme="@android:style/Theme.NoDisplay"


0

您可以setContentView(R.layout.mLayout)从活动中删除主题并将其设置为android:theme="@style/AppTheme.Transparent"。检查此链接以获取更多详细信息。

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.