ChatGPT解决这个技术问题 Extra ChatGPT

How do I create a transparent Activity on Android?

I want to create a transparent Activity on top of another activity.

How can I achieve this?

Can you tell us what is the use of the transparent activity

P
Peter Mortensen

Add the following style in your res/values/styles.xml file (if you don’t have one, create it.) Here’s a complete file:

<?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>

(The value @color/transparent is the color value #00000000 which I put in the res/values/color.xml file. You can also use @android:color/transparent in later Android versions.)

Then apply the style to your activity, for example:

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

I used <item name="android:windowBackground">@android:color/transparent</item>
Great! Just one improvement: If you use parent="@android:style/Theme.Dialog" you will get the exactly behaviour of a dialog. That means fading in/out instead of sliding in/out (like an activity)
As @Emilio mentioned this will behave like a dialog, mainly because of android:windowIsFloating set to true. Remove this property to behave like a normal activity (in this case it will match android:style/Theme.Translucent.NoTitleBar)
I removed true to have a fullscreen & transparent activity
My activity was derived from AppCompatActivity. So parent="android:Theme" was crashing my app. I just removed it and it worked like charm. Thanks!
y
yanchenko

It goes like this:

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

You just add the theme as alex has posted to your activity declaration in the manifest - this bit android:theme="@android:style/Theme.Translucent.NoTitleBar, for each Activity you can assign it the Translucent theme
can you tell me how can i transparent activity 50%? becase this is 100% and i need 50%
@user1129443: 50% black should be #7f000000. Each component (A, R, G, B) can take values from 0-255. 50% of 255 = 127. 127 in Hex = 7F That how to calculate transparency (opacity)
This method kind of locks the UI as the activity is running but since it is set to translucent,One cannot do anything.Is there a way to avoid this UI locking.
@yanchenko Unfortunately this is not a good solution. As Akhil says, it locks up the UI!
A
Andrew

In the 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>

In the AndroidManifest.xml:

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

If you are planning on actually displaying something on this Activity (say a Dialog or DialogFragment), you'll notice that everything is Dark themed. So you may want your theme to inherit from Theme.Appcompat.Light.NoActionBar instead.
in my case it showing black background.I have parent theme set something else but on one particular activity I am changing theme as mentioned.Any help?
Works great when I remove "android:background"
i think you want to remove background and put your preferred semi transparent colour in windowBackground
This should be the answer if your activity is using AppCompatActivity in contrast to @gnobal's answer.
M
Murli Prajapati

Declare your activity in the manifest like this:

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

And add a transparent background to your layout.


Best way. Thank
You need to use a Theme.AppCompat theme (or descendant) with this activity.
P
Peter Mortensen

Assign the translucent theme to the activity that you want to make transparent in the Android manifest file of your project:

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

R
Rahul Gaur

In my case, i have to set the theme on the runtime in java based on some conditions. So I created one theme in style (similar to other answers):

<?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>

Then in Java I applied it to my activity:

@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);
}

Remember one Important point here: You must call the setTheme() function before super.onCreate(savedInstanceState);. I missed this point and stucked for 2 hours, thinking why my theme is not reflected at run time.


java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
C
Community

I wanted to add to this a little bit as I am a new Android developer as well. The accepted answer is great, but I did run into some trouble. I wasn't sure how to add in the color to the colors.xml file. Here is how it should be done:

colors.xml

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

In my original colors.xml file I had the tag "drawable":

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

And so I did that for the color as well, but I didn't understand that the "@color/" reference meant look for the tag "color" in the XML. I thought that I should mention this as well to help anyone else out.


P
Peter Mortensen

I achieved it on 2.3.3 by just adding android:theme="@android:style/Theme.Translucent" in the activity tag in the manifest.

I don't know about lower versions...


This works fine for 2.2 also. I just created a simple activity with a listview and it floats ontop of the last activity.
It was added in API 1, that's not a problem :)
Do not use AppCompatActivity if you're using this.
works in 7.0 also so its good approach. I modified it to @android:style/Theme.Translucent.NoTitleBar.Fullscreen
F
Fattie

2021 facts

Just add

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

You're done.

windowIsFloating wrong, this makes an INSET floating window.

windowContentOverlay only relates to shadows.

windowIsTranslucent is WRONG, it DOES NOT make it so you can see the activity behind. windowIsTranslucent is only relevant if animating transitions.

backgroundDimEnabled dims the activity below, BUT, it is completely buggy on different devices. (In some cases, it does nothing unless you are using windowIsFloating; in general the behavior is totally buggy/indeterminate.)

colorBackgroundCacheHint is irrelevant except on extremely old devices, the default is null anyway.


"extremely old devices" - Written 10 years ago, only 2 years after Android launched. I guess devices from 2011 in 2021 must be considered "ancient". lol
Your solution doesn't do the thing actually. The accepted answer, it's 10 years old but it works find.. just need to extend AppCompat theme instead of Theme..
The accepted answer is quite wrong, for the reasons explained in the five bullet points here. (You can, simply, read the doco for each point to get the facts.)
P
Peter Mortensen

In the onCreate function, below the setContentView, add this line:

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

Makes the background to completely BLACK for some reason.
mine too @SubinSebastian, did anyone find a fix to that?
P
Peter Mortensen

Just let the activity background image be transparent. Or add the theme in the XML file:

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

P
Peter Mortensen

The easiest way that I have found is to set the activity's theme in the AndroidManifest to android:theme="@android:style/Theme.Holo.Dialog".

Then in the activity's onCreate method, call getWindow().setBackgroundDrawable(new ColorDrawable(0));.


P
Peter Mortensen

For dialog activity I use this:

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

But you also need to set your main View in the activity to invisible. Otherwise the background will be invisible while all views in it will be visible.


Makes the background to completely BLACK
Z
Zafer Celaloglu

in addition to the above answers:

to avoid android Oreo related crash on activity

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

As of 2018, this should be the best answer
gave me a black background on emulator with API 28
I tried this to fix crash related to setting orientation in android 8.0 but I am still getting IllegalStateException: Only fullscreen opaque activities request orientation
Works really well. Tested on Samsung S20 on Android 11. It still shows a black screen on the emulator, but just a slightly dimmed screen otherwise.
Adding the code below should remove the dim that you get with it being a dialog theme. window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
Z
Zohab Ali

If you are using AppCompatActivity then add this in 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>

In manifest file you can add this theme to activity tag like this

android:theme="@style/TransparentCompat"

for more details read this article


bro When i use the Above Code the transparent was Working Perfect But it doesnt display the opacity of the previous Artboard it Display the Bg of my Home Screen ( wallpeper Screen ) [![i.stack.imgur.com/rQzd2.jpg][1]][1] [1]:
P
Peter Mortensen

I just did two things, and it made my activity transparent. They are below.

In the manifest file I just added the below code in the activity tag. android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" And I just set the background of the main layout for that activity as "#80000000". Like android:background="#80000000"

It perfectly works for me.


M
Michael Härtl

Assign it the Translucent theme

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

E
Ebite Zion

There're two ways:

Using Theme.NoDisplay Using Theme.Translucent.NoTitleBar

Using Theme.NoDisplay will still work… but only on older Android devices. On Android 6.0 and higher, using Theme.NoDisplay without calling finish() in onCreate() (or, technically, before onResume()) will crash your app. This is why the recommendation is to use Theme.Translucent.NoTitleBar, which does not suffer from this limitation.”


M
ManiTeja

Note 1:In Drawable folder create test.xml and copy the following code

   <?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>

// Note: Corners and shape is as per your requirement.

// Note 2:Create 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>

P
Peter Mortensen

Just add the following line to the activity tag in your manifest file that needs to look transparent.

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

K
Kashkashio

All those answers might be confusing, there is a difference between Transparent activity and None UI activity.

Using this:

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

Will make the activity transparent but will block the UI.

If you want a None UI activity than use this:

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


B
Bali

You can remove setContentView(R.layout.mLayout) from your activity and set theme as android:theme="@style/AppTheme.Transparent". Check this link for more details.


M
Mark Nashat

just put this in style.xml

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

oR Add in Manifest

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

A
Arshak

Along with the gnobal's above solution, I had to set alpha to 0 in the layout file of that particular activity, because on certain phone (Redmi Narzo 20 pro running on Android 10) a dialog portion of the screen was showing with the screen that was supposed to be transparent. For some reason the windowIsFloating was causing this issue, but on removing it I wasn't getting the desired output.

Steps:

Add the following in the style.xml located under res > values > styles.xml Set the theme of the activity with the above style in AndroidManifest.xml Open your layout file of the activity on which you applied the above style and set it's alpha value to 0 (android:alpha="0") for the parent layout element.

Please Note:

Activity()

not AppCompatActivity