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

时间:2010-02-01 13:28:03

标签: android android-activity transparent

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

我怎样才能做到这一点?

23 个答案:

答案 0 :(得分:1298)

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版本中使用@android:color/transparent。)

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

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

答案 1 :(得分:187)

它是这样的:

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

答案 2 :(得分:108)

使用“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>

在AndroidManifest.xml中:

<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>

答案 3 :(得分:35)

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

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

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

答案 4 :(得分:27)

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

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

答案 5 :(得分: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>

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

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

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

答案 6 :(得分:15)

我在2.3.3上实现了它,只需在清单中的activity标记中添加android:theme="@android:style/Theme.Translucent"

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

答案 7 :(得分:11)

在我的情况下,我必须根据某些条件在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);函数。我错过了这一点并且坚持了2个小时,想到为什么我的主题没有在运行时反映出来。

答案 8 :(得分:7)

让活动背景图片透明。或者在XML文件中添加主题:

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

答案 9 :(得分:7)

onCreate 功能中,在 setContentView 下方,添加以下行:

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

答案 10 :(得分:6)

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

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

答案 11 :(得分:5)

对于对话活动我使用:

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

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

答案 12 :(得分:4)

2021 年事实

只需添加

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

大功告成。

windowIsFloating 错了,这是一个 INSET 浮动窗口。

windowContentOverlay 仅与阴影有关。

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

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

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

答案 13 :(得分:3)

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

  1. 在清单文件中,我刚刚在活动标记中添加了以下代码。

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

    android:background="#80000000"
    
  3. 它对我很有用。

答案 14 :(得分:3)

除了以上答案:

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

答案 15 :(得分:2)

为其指定半透明主题

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

答案 16 :(得分:2)

有两种方式:

  1. 使用Theme.NoDisplay
  2. 使用Theme.Translucent.NoTitleBar
  3. 使用Theme.NoDisplay仍可使用...但仅适用于较旧的Android设备。在Android 6.0及更高版本中,使用Theme.NoDisplay而不在finish()中调用onCreate() (or, technically, before onResume()) 崩溃 您的应用。这就是为什么建议要使用Theme.Translucent.NoTitleBar,而不受此限制的影响。“

答案 17 :(得分: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>

答案 18 :(得分:0)

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

使用此:

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

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

如果您要进行None UI活动而不是使用此功能:

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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

伴随上述gnobal's解决方案,我必须在该特定活动的布局文件中将 alpha设置为0 ,因为在某些手机上(运行在Android 10上的Redmi Narzo 20 pro )屏幕的对话框部分显示了应该是透明的屏幕。由于某些原因,windowIsFloating导致了此问题,但是在删除它时,我没有得到所需的输出。

步骤:

  1. 在res> values> styles.xml

    下的style.xml中添加以下内容
     <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>
       <item name="android:colorBackgroundCacheHint">@null</item>
     </style>
    

  2. 使用上述样式设置活动的主题 AndroidManifest.xml

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

  3. 打开您应用了上述样式的活动的布局文件,并将其父布局元素的Alpha值设置为0(android:alpha="0")。

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:alpha="0">
    
      <WebView        
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="0"/>
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

请注意:您必须使用 Activity()类和 not AppCompatActivity 扩展您的活动才能使用上述解决方案。

答案 21 :(得分:0)

如果您使用的是 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"

有关更多详细信息,请阅读此article

答案 22 :(得分:0)

把它放在 style.xml 中

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

或在清单中添加

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