Jak utworzyć przezroczystą aktywność na Androidzie?

Odpowiedzi:

1392

Dodaj następujący styl do swojego res/values/styles.xmlpliku (jeśli go nie masz, utwórz go). Oto kompletny plik:

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

(Wartością @color/transparentjest wartość koloru, #00000000którą umieściłem w res/values/color.xmlpliku. Możesz także użyć @android:color/transparentw późniejszych wersjach Androida).

Następnie zastosuj styl do swojej aktywności, na przykład:

<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>
gnobal
źródło
13
Użyłem<item name="android:windowBackground">@android:color/transparent</item>
Someone Somewhere
33
Świetny! Tylko jedno ulepszenie: jeśli użyjesz rodzica = "@ android: style / Theme.Dialog" otrzymasz dokładnie zachowanie okna dialogowego. Oznacza to zanikanie / zmniejszanie zamiast przesuwania się (jak działanie)
PakitoV,
73
Jak wspomniano @Emilio, będzie to zachowywać się jak okno dialogowe, głównie z powodu android:windowIsFloatingustawienia na true. Usuń tę właściwość, aby zachowywać się jak normalna aktywność (w tym przypadku będzie pasować android:style/Theme.Translucent.NoTitleBar)
aromero
38
Usunąłem <item name = "android: windowIsFloating"> true </item>, aby mieć pełny ekran i przejrzystą aktywność
Kiem Duong
12
Moja działalność pochodzi od AppCompatActivity. Tak samo parent="android:Theme"awaria mojej aplikacji. Właśnie go usunąłem i działało to jak urok. Dzięki!
Atul
193

Wygląda to tak:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Janchenko
źródło
3
Po prostu dodajesz motyw, jak alex opublikował w deklaracji aktywności w manifeście - ten bit android: theme = "@ android: style / Theme.Translucent.NoTitleBar, do każdego działania możesz przypisać mu motyw Translucent
Donal Rafferty
12
@UMMA: Zazwyczaj wystarczy użyć jednego znaku zapytania. Wiele znaków zapytania sprawia, że ​​ludzie, którzy poświęcają czas, by odpowiedzieć na twoje pytania, myślą, że skaczesz na ich twarze.
Matthias
7
@Matthias zwykle nimi są, ponieważ ich szefowie skaczą na nich
Reno
16
@ user1129443: 50% black should be #7f000000. Każdy składnik (A, R, G, B) może przyjmować wartości 0-255. 50% of 255 = 127. 127 in Hex = 7FTo, jak obliczyć przezroczystość (nieprzezroczystość)
Nam Trung
4
Ta metoda blokuje interfejs użytkownika podczas działania, ale ponieważ jest ustawiony na półprzezroczysty, nic nie można zrobić. Jest sposób, aby uniknąć tego blokowania interfejsu użytkownika.
Akhil Latta
126

W pliku 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>

W AndroidManifest.xml:

<activity
    android:name=".WhateverNameOfTheActivityIs"
    android:theme="@style/Theme.AppCompat.Translucent">
    ...
</activity>
Andrey
źródło
1
Jeśli planujesz faktycznie wyświetlać coś w tym działaniu (powiedzmy Dialog lub DialogFragment), zauważysz, że wszystko jest w tematyce Dark. Możesz więc Theme.Appcompat.Light.NoActionBarzamiast tego odziedziczyć motyw .
tir38
1
w moim przypadku pokazuje czarne tło. Mam motyw nadrzędny ustawiający coś innego, ale w jednym konkretnym działaniu zmieniam motyw, jak wspomniano. Jakaś pomoc?
Abdul Waheed
4
Działa świetnie, gdy usuwam „android: tło”
Oded Breiner
2
myślę, że chcesz usunąć backgroundi umieścić preferowany kolor półprzezroczysty wwindowBackground
hmac
To powinna być odpowiedź, jeśli twoja aktywność używa AppCompatActivity w przeciwieństwie do odpowiedzi @ gnobal.
AeroEchelon
37

Zadeklaruj swoją aktywność w manifeście w ten sposób:

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

I dodaj przezroczyste tło do swojego układu.

Deepak Swami
źródło
Najlepszym sposobem. Dziękuję
Peter,
5
Z tym działaniem musisz użyć motywu Theme.AppCompat (lub elementu potomnego).
Puni
28

Przypisz półprzezroczysty motyw do działania, które chcesz uczynić przezroczystym w pliku manifestu Androida swojego projektu:

<activity
    android:name="YOUR COMPLETE ACTIVITY NAME WITH PACKAGE"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Jigar Pandya
źródło
16

Chciałem to trochę dodać, ponieważ jestem również nowym programistą Androida. Przyjęta odpowiedź jest świetna, ale miałem problemy. Nie byłem pewien, jak dodać kolor do pliku colors.xml. Oto, jak należy to zrobić:

colors.xml

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

W moim oryginalnym pliku colors.xml miałem tag „drawable”:

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

Zrobiłem to również dla koloru, ale nie rozumiałem, że odwołanie „@ color /” oznacza poszukiwanie znacznika „color” w pliku XML. Pomyślałem, że powinienem również o tym wspomnieć, aby pomóc wszystkim innym.

Camille Sévigny
źródło
16

Osiągnąłem to w 2.3.3, po prostu dodając android:theme="@android:style/Theme.Translucent"znacznik aktywności w manifeście.

Nie wiem o niższych wersjach ...

androabhay
źródło
Działa to również dobrze w wersji 2.2. Właśnie utworzyłem prostą czynność z widokiem listy, która unosi się nad ostatnią aktywnością.
slott
Został dodany w API 1, to nie jest problem :)
xmen
6
Nie używaj, AppCompatActivityjeśli używasz tego.
zackygaurav
działa również w wersji 7.0, więc jest to dobre podejście. Zmodyfikowałem go do @android: style / Theme.Translucent.NoTitleBar.Fullscreen
Sandeep
16

W moim przypadku muszę ustawić motyw w środowisku wykonawczym w Javie na podstawie niektórych warunków. Więc stworzyłem jeden motyw w stylu (podobny do innych odpowiedzi):

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

Następnie w Javie zastosowałem to do mojej działalności:

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

Zapamiętaj jeden Ważny punkt tutaj: musisz wywołać tę setTheme()funkcję wcześniej super.onCreate(savedInstanceState);. Brakowało mi tego punktu i utknąłem na 2 godziny, zastanawiając się, dlaczego mój motyw nie jest odzwierciedlany w czasie wykonywania.

Klejnot
źródło
9

W funkcji onCreate , poniżej setContentView , dodaj ten wiersz:

getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Leebeedev
źródło
23
Z jakiegoś powodu tło staje się całkowicie CZARNE.
Subin Sebastian,
moje też @SubinSebastian, czy ktoś znalazł rozwiązanie tego problemu?
finnmglas
8

Niech obraz tła aktywności będzie przezroczysty. Lub dodaj motyw w pliku XML:

<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Jian
źródło
7

Najłatwiejszym sposobem, jaki znalazłem, jest ustawienie motywu działania w AndroidManifest na android:theme="@android:style/Theme.Holo.Dialog".

Następnie w metodzie onCreate działania wywołanie getWindow().setBackgroundDrawable(new ColorDrawable(0));.

Drew Leonce
źródło
6

Do aktywności w dialogu używam tego:

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

Ale musisz także ustawić swój główny widok w aktywności na niewidoczny. W przeciwnym razie tło będzie niewidoczne, a wszystkie widoki w nim będą widoczne.

Pavel Kataykin
źródło
2
Sprawia, że ​​tło jest całkowicie CZARNE
ucMedia
5

oprócz powyższych odpowiedzi:

aby uniknąć awarii Androida związanej z 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" />
Zafer Celaloglu
źródło
2
Od 2018 roku powinna to być najlepsza odpowiedź
Geek Guy
dał mi czarne tło na emulatorze z API 28
Someone Somewhere
Próbowałem to naprawić awarię związaną z ustawieniem orientacji w Androidzie 8.0, ale nadal otrzymuję IllegalStateException: tylko orientacja nieprzejrzystych działań na pełnym ekranie
Rahul Sahni
3

Zrobiłem tylko dwie rzeczy, dzięki czemu moja działalność była przejrzysta. Są poniżej.

  1. W pliku manifestu właśnie dodałem poniższy kod w tagu aktywności .

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. I właśnie ustawiłem tło głównego układu dla tego działania jako „ # 80000000 ”. Lubić

    android:background="#80000000"

To doskonale dla mnie działa.

Md Sufi Khan
źródło
3

Jeśli używasz, AppCompatActivitydodaj tostyles.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>

W manifestpliku możesz dodać ten motyw do tagu aktywności takiego jak ten

android:theme="@style/TransparentCompat"

Aby uzyskać więcej informacji, przeczytaj ten artykuł

Zohab Ali
źródło
2

Przypisz do niego motyw Przezroczysty

android:theme="@android:style/Theme.Translucent.NoTitleBar"
saurabh
źródło
2

Istnieją dwa sposoby:

  1. Korzystanie z Theme.NoDisplay
  2. Korzystanie Theme.Translucent.NoTitleBar

Korzystanie Theme.NoDisplaybędzie nadal działać… ale tylko na starszych urządzeniach z Androidem. W Androidzie 6.0 i wyższe, wykorzystując Theme.NoDisplay bez zawijania finish()w onCreate() (or, technically, before onResume())będą upaść swoją aplikację. Dlatego zaleca się stosowanie Theme.Translucent.NoTitleBar, które nie podlega tym ograniczeniom . ”

Shubham Soni
źródło
1

Uwaga 1: W folderze Drawable utwórz plik test.xml i skopiuj następujący kod

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

// Uwaga: Narożniki i kształt są zgodne z wymaganiami.

// Uwaga 2: Utwórz 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>
ManiTeja
źródło
0

Wystarczy dodać następujący wiersz do tagu aktywności w pliku manifestu, który musi wyglądać przezroczysto.

android:theme="@android:style/Theme.Translucent"
Kanagalingam
źródło
0

Wszystkie te odpowiedzi mogą być mylące, istnieje różnica między aktywnością Transparent a aktywnością None UI.

Za pomocą tego:

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

Sprawi, że działanie będzie przezroczyste, ale zablokuje interfejs użytkownika.

Jeśli chcesz mieć działanie interfejsu użytkownika Brak, użyj tego:

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

Kashkashio
źródło
0

Możesz usunąć setContentView(R.layout.mLayout)z aktywności i ustawić motyw jako android:theme="@style/AppTheme.Transparent". Sprawdź ten link, aby uzyskać więcej informacji.

Bali
źródło