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

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

我怎样才能做到这一点?

494248 次浏览

它是这样的:

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

在您的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 android:name=".SampleActivity" android:theme="@style/Theme.Transparent">...</activity>

我想补充一点,因为我也是一个新的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 name="class_zero_background">#7f040000</drawable>

所以我也对颜色这样做了,但是我不明白“@颜色/”引用意味着在XML中查找标签“颜色”。我想我也应该提到这一点来帮助其他人。

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

我不知道低版本…

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

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

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

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

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

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

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

将其设置为半透明主题

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

我只做了两件事,它使我的活动透明化了。

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

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. And I just set the background of the main layout for that activity as "#80000000". Like

    android:background="#80000000"

It perfectly works for me.

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

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

onCreate函数中,在设置内容视图下方,添加以下行:

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

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

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

在我的情况下,我必须根据一些条件在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我把它应用到我的活动中:

@Overrideprotected 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 loginsetTheme(R.style.Theme_Transparent);super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);
} elsesuper.onCreate(savedInstanceState);
setContentView(R.layout.activity_dummy);}

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

注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" />
<gradientandroid:angle="90"android:endColor="#29000000"android:startColor="#29000000" />
<cornersandroid: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" >
<LinearLayoutandroid: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>

只需将以下行添加到清单文件中需要看起来透明的活动标记中。

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

对于对话框活动,我使用这个:

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

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

有两种方法:

  1. 使用主题
  2. 使用主题.半透明. NoTitleBar

使用Theme.NoDisplay仍然有效…但仅适用于较旧的Android设备。在Android 6.0及更高版本上,使用Thame. NoDisplay而不在onCreate() (or, technically, before onResume())中调用finish()崩溃您的应用程序。这就是为什么建议要使用Theme.Translucent.NoTitleBar,它不会受到限制的影响。”

除了以上回答:

避免与Android Oreo相关的活动崩溃

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

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

更多详情请阅读文章

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

使用这个:

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

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

如果您想要无UI活动,请使用:

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

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

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

步骤:

  1. 在res>值>下的style.xml中添加以下内容styles.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

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

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

    <?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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">
    <WebViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:alpha="0"/>
    </androidx.constraintlayout.widget.ConstraintLayout>

请注意:您必须使用活动()类和非应用关联活动来扩展您的活动才能使用上述解决方案。

2021事实

只需添加

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

你完蛋了。

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

windowContentOverlay只涉及阴影。

windowIsTranslucent是错误的,它不能使它,所以你可以看到后面的活动。windows只有在动画转换时才相关。

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

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

把这个放style.xml

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

oR添加清单

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