Как мне создать прозрачную активность на Android?


Ответы:


1394

Добавьте следующий стиль в свой 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- это значение цвета, #00000000которое я поместил в res/values/color.xmlфайл. Вы также можете использовать его @android:color/transparentв более поздних версиях Android.)

Затем примените стиль к своей деятельности, например:

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

13
Я использовал<item name="android:windowBackground">@android:color/transparent</item>
Кто-то где-то

33
Большой! Только одно улучшение: если вы используете parent = "@ android: style / Theme.Dialog", вы получите точно такое же поведение диалога. Это означает постепенное исчезновение / уменьшение вместо скольжения (как действие)
PakitoV

73
Как упомянул @Emilio, это будет вести себя как диалог, в основном из-за android:windowIsFloatingустановки в true. Удалите это свойство, чтобы вести себя как обычная деятельность (в этом случае она будет соответствовать android:style/Theme.Translucent.NoTitleBar)
aromero

38
Я удалил <item name = "android: windowIsFloating"> true </ item>, чтобы иметь полноэкранную и прозрачную активность
Kiem Duong

12
Моя деятельность была получена из AppCompatActivity. Так что parent="android:Theme"вылетало мое приложение. Я только удалил это, и это работало как очарование. Спасибо!
Атул

193

Это выглядит так:

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

3
Вы просто добавляете тему, которую alex опубликовал в декларации своей активности в манифесте - этот бит android: theme = "@ android: style / Theme.Translucent.NoTitleBar, для каждой операции вы можете назначить ей полупрозрачную тему
Donal Rafferty

12
@UMMA: обычно достаточно одного знака вопроса. Несколько вопросительных знаков заставляют людей, которые нашли время ответить на ваши вопросы, думать, что вы прыгаете им в лицо.
Матиас

7
@Matthias они обычно, потому что их боссы прыгают на своих
Рено

16
@ user1129443: 50% black should be #7f000000. Каждый компонент (A, R, G, B) может принимать значения из 0-255. 50% of 255 = 127. 127 in Hex = 7FВот как рассчитать прозрачность (непрозрачность)
Нам Трунг

4
Этот метод блокирует пользовательский интерфейс во время выполнения действия, но так как он установлен на полупрозрачный, никто ничего не может сделать. Есть способ избежать этой блокировки пользовательского интерфейса.
Ахил Латта

126

В файле 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:

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

1
Если вы планируете на самом деле что-то отображать в этом упражнении (скажем, Dialog или DialogFragment), вы заметите, что все в темноте. Таким образом, вы можете захотеть, чтобы ваша тема наследовала Theme.Appcompat.Light.NoActionBar.
tir38

1
в моем случае это черный фон. У меня родительская тема задала что-то другое, но в одном конкретном упражнении я меняю тему, как уже упоминалось.
Абдул Вахид

4
Прекрасно работает, когда я
удаляю

2
я думаю, что вы хотите удалить backgroundи поместить предпочитаемый полупрозрачный цвет вwindowBackground
hmac

Это должно быть ответом, если ваша деятельность использует AppCompatActivity в отличие от ответа @ gnobal.
Аэроэшелон

37

Объявите свою деятельность в манифесте следующим образом:

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

И добавьте прозрачный фон к вашему макету.


Лучший способ. Спасибо
Петр,

5
Вам нужно использовать тему Theme.AppCompat (или потомок) с этим действием.
Пуни

28

Назначьте полупрозрачную тему для действия, которое вы хотите сделать прозрачным, в файле манифеста Android вашего проекта:

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

16

Я хотел бы добавить к этому немного, поскольку я также являюсь новым разработчиком 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»:

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

И поэтому я сделал это для цвета, но я не понимал, что ссылка "@ color /" означает поиск тега "color" в XML. Я думал, что должен упомянуть об этом, чтобы помочь кому-то еще.


16

Я добился этого на 2.3.3, просто добавив android:theme="@android:style/Theme.Translucent"тег активности в манифест.

Я не знаю о более низких версиях ...


Это работает отлично для 2.2 также. Я только что создал простое действие со списком, и оно всплывает поверх последнего действия.
slott

Это было добавлено в API 1, это не проблема :)
xmen

6
Не используйте, AppCompatActivityесли вы используете это.
Закигаурав

работает в 7.0 и так его хороший подход. Я изменил его на @android: style / Theme.Translucent.NoTitleBar.Fullscreen
Сандип,

16

В моем случае я должен установить тему во время выполнения в 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 я применил это к моей деятельности:

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

Запомните один важный момент : вы должны вызвать setTheme()функцию раньше super.onCreate(savedInstanceState);. Я пропустил этот пункт и застрял на 2 часа, думая, почему моя тема не отражается во время выполнения.


9

В функции onCreate , под setContentView , добавьте эту строку:

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

23
По какой-то причине фон становится ЧЕРНЫМ.
Субин Себастьян

мой тоже @SubinSebastian, кто-нибудь нашел решение этой проблемы?
finnmglas

8

Просто позвольте фоновому изображению активности быть прозрачным. Или добавьте тему в файл XML:

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

7

Самый простой способ, который я нашел, это установить тему действия в AndroidManifest на android:theme="@android:style/Theme.Holo.Dialog".

Затем в методе действия onCreate вызовите getWindow().setBackgroundDrawable(new ColorDrawable(0));.


6

Для диалоговой деятельности я использую это:

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

Но вам также нужно установить основной вид в упражнении на невидимый. В противном случае фон будет невидимым, а все виды в нем будут видны.


2
Делает фон полностью
черным

5

в дополнение к вышеуказанным ответам:

чтобы избежать краха Android 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
По состоянию на 2018 год это должен быть лучший ответ
Geek Guy

дал мне черный фон на эмуляторе с API 28
Someone Somewhere

Я пытался исправить ошибку, связанную с установкой ориентации в Android 8.0, но я все еще получаю IllegalStateException: только полноэкранные непрозрачные действия запрашивают ориентацию
Рахул Сахни

3

Я просто сделал две вещи, и это сделало мою деятельность прозрачной. Они ниже.

  1. В файле манифеста я просто добавил приведенный ниже код в тег активности .

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
  2. И я просто установил фон основного макета для этого действия как " # 80000000 ". подобно

    android:background="#80000000"

Это прекрасно работает для меня.


3

Если вы используете, 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"

для более подробной информации прочитайте эту статью


2

Присвойте ей полупрозрачную тему

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

2

Есть два способа:

  1. Использование Theme.NoDisplay
  2. Использование Theme.Translucent.NoTitleBar

Использование по- Theme.NoDisplayпрежнему будет работать ... но только на старых устройствах Android. На Android 6.0 и выше, используя Theme.NoDisplay без вызова finish()в onCreate() (or, technically, before onResume())будет врезаться ваше приложение. Вот почему рекомендуется использовать Theme.Translucent.NoTitleBar, который не страдает от этого ограничения ».


1

Примечание 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" />

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

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

Просто добавьте следующую строку в тег активности в файле манифеста, который должен выглядеть прозрачным.

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

0

Все эти ответы могут вводить в заблуждение, есть разница между прозрачной активностью и отсутствием пользовательского интерфейса.

Используя это:

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

Сделает деятельность прозрачной, но заблокирует пользовательский интерфейс.

Если вы хотите None UI активность, чем использовать это:

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


0

Вы можете удалить setContentView(R.layout.mLayout)из своей деятельности и установить тему как android:theme="@style/AppTheme.Transparent". Проверьте эту ссылку для более подробной информации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.