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