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>

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

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>

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.


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

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.


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


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.


9

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

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

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

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));.


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.


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

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.


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ł


2

Przypisz do niego motyw Przezroczysty

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

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 . ”


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>

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"

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"


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.