Как мне создать прозрачную активность на 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>
gnobal
источник
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"тег активности в манифест.

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

androabhay
источник
Это работает отлично для 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));
Leebeedev
источник
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"

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

Md Суфи Хан
источник
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>
ManiTeja
источник
0

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

android:theme="@android:style/Theme.Translucent"
Kanagalingam
источник
0

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

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

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

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

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

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

Kashkashio
источник
0

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

Бали
источник