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

How do I create a transparent Activity on Android?

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

我怎样才能做到这一点?


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

1
2
3
4
5
6
7
8
9
10
11
<?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

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

1
2
...
</activity>


就像这样:

1
 


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

在styles.xml中:

1
2
3
4
5
6
7
8
<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中:

1
2
3
4
5
<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>


在清单中这样声明您的活动:

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

并在布局中添加透明背景。


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

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


我想补充一下,因为我也是一个新的Android开发者。公认的答案很好,但我确实遇到了一些麻烦。我不知道如何将颜色添加到colors.xml文件中。这是应该怎么做的:

颜色XML

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<resources>
     <color name="class_zero_background">#7f040000</color>
     <color name="transparent">#00000000</color>
</resources>

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

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

所以我也为颜色做了这些,但我不理解"@color/"引用意味着在XML中查找标记"color"。我想我也应该提这个来帮助其他人。


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

我不知道低版本…


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

1
2
3
4
5
6
7
8
9
10
11
<?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中,我把它应用到我的活动中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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()函数。我错过了这一点,呆呆了2个小时,想着为什么我的主题在运行时没有反映出来。


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

1
 

在onCreate函数的setContentView下,添加此行:

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


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

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


对于对话活动,我使用:

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

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


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

  • 在清单文件中,我刚刚在活动标记中添加了下面的代码。

    1
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  • 我只是将该活动的主布局背景设置为"800000000"。喜欢

    1
    android:background="#80000000"
  • 这对我来说非常有效。


    为它指定半透明主题

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

    有两种方法:

  • 使用theme.nodisplay
  • 使用theme.transparent.notitlebar
  • 使用Theme.NoDisplay仍然有效……但只能在较旧的安卓设备上使用。在android 6.0及更高版本上,使用theme.nodisplay而不在onCreate() (or, technically, before onResume())中调用finish()会使应用程序崩溃。这就是建议使用不受此限制的Theme.Translucent.NoTitleBar的原因。"


    除上述答案外:

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

    1
    2
    3
    4
    5
    6
    7
    8
    <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" />


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
       <?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:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        <?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>

    如果您使用的是AppCompatActivity,则将其添加到styles.xml中。

    1
    2
    3
    4
    5
    6
    7
    <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文件中,您可以像这样将这个主题添加到活动标签中。

    1
    android:theme="@style/TransparentCompat"

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


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

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