Как мне создать прозрачную активность на Android?
Я хочу создать прозрачное действие поверх другого действия.
Как мне этого добиться?
25 ответов
Добавьте следующий стиль в ваш 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>
Это выглядит так:
<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
С библиотекой "AppCompat" или "Библиотекой поддержки Android Design" все немного по-другому:
В файле 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>
Объявите свою деятельность в манифесте следующим образом:
<activity
android:name=".yourActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
И добавьте прозрачный фон к вашему макету.
Назначьте полупрозрачную тему для действия, которое вы хотите сделать прозрачным, в файле манифеста Android вашего проекта:
<activity
android:name="YOUR COMPLETE ACTIVITY NAME WITH PACKAGE"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
В моем случае я должен установить тему во время выполнения в 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 часа, думая, почему моя тема не отражается во время выполнения.
2021 факты
Просто добавь
<item name="android:windowBackground">@android:color/transparent</item>
Готово.
windowIsFloating
неправильно, это делает окно INSET плавающим.
windowContentOverlay
относится только к теням.
windowIsTranslucent
НЕПРАВИЛЬНО, он НЕ делает его так, чтобы вы могли видеть, что происходит за ним.windowIsTranslucent актуально только при анимации переходов.
backgroundDimEnabled
затемняет активность ниже, НО она полностью глючит на разных устройствах. (В некоторых случаях он ничего не делает, если вы не используете windowIsFloating; в целом поведение полностью ошибочно / неопределенно.)
colorBackgroundCacheHint
не имеет значения, за исключением очень старых устройств, значение по умолчанию в любом случае равно null.
Я достиг этого на 2.3.3, просто добавив android:theme="@android:style/Theme.Translucent"
в теге активности в манифесте.
Я не знаю о более низких версиях...
Я хотел бы добавить к этому немного, поскольку я также являюсь новым разработчиком 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. Я думал, что должен упомянуть об этом, чтобы помочь кому-то еще.
В функции onCreate, под setContentView, добавьте эту строку:
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Просто позвольте фоновому изображению активности быть прозрачным. Или добавьте тему в файл XML:
<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
В дополнение к вышеуказанным ответам:
чтобы избежать падения 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" />
Самый простой способ, который я нашел, - установить тему действия в AndroidManifest на android:theme="@android:style/Theme.Holo.Dialog"
,
Затем в методе действия onCreate вызовите getWindow().setBackgroundDrawable(new ColorDrawable(0));
,
Для диалоговой деятельности я использую это:
getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);
Но вам также нужно установить основной вид в упражнении на невидимый. В противном случае фон будет невидимым, а все виды в нем будут видны.
Если вы используете 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"
для более подробной информации прочитайте эту статью
Я просто сделал две вещи, и это сделало мою деятельность прозрачной. Они ниже.
В файле манифеста я только что добавил приведенный ниже код в тег активности.
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
И я просто установил фон основного макета для этого действия как "# 80000000". подобно
android:background="#80000000"
Это прекрасно работает для меня.
Присвойте ей полупрозрачную тему
android:theme="@android:style/Theme.Translucent.NoTitleBar"
Есть два способа:
- Использование Theme.NoDisplay
- Использование Theme.Translucent.NoTitleBar
С помощью Theme.NoDisplay
все еще будет работать... но только на старых устройствах Android. На Android 6.0 и выше, используя Theme.NoDisplay без вызова finish()
в onCreate() (or, technically, before onResume())
вылетит ваше приложение. Вот почему рекомендуется использовать Theme.Translucent.NoTitleBar
, который не страдает от этого ограничения".
Все эти ответы могут сбивать с толку, есть разница между прозрачной активностью и отсутствием пользовательского интерфейса.
Используя это:
android:theme="@android:style/Theme.Translucent.NoTitleBar"
Сделает действие прозрачным, но заблокирует пользовательский интерфейс.
Если вам нужно действие None UI, используйте это:
android:theme="@android:style/Theme.NoDisplay"
Примечание 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>
Другие решения сработали для меня, но я заметил проблему, которая может затронуть некоторых. Когда я начинаю свою деятельность следующим образом:
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
Вместо такой строчки
startActivity(new Intent(this, MainActivity.class));
Я просто получаю черный фон, который является болью. Я не понял, в чем причина, я предполагаю, что это связано с устройством (проверено на Xiaomi). Таким образом, передаваемые значения также должны быть такими.
startActivity(new Intent(this, MainActivity.class)
.putExtra("SOME_VALUE", value)
.putExtra("ANOTHER_VALUE", value2));
Изменить: изменение родительского стиля на Theme.AppCompat.Light.NoActionBar , похоже, устранило эту проблему.
просто поместите это в style.xml
<item name="android:windowBackground">@android:color/transparent</item>
или Добавить в манифест
<activity android:name=".usual.activity.Declaration"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Просто добавьте следующую строку в тег активности в файле манифеста, который должен выглядеть прозрачным.
android:theme="@android:style/Theme.Translucent"
Вы можете удалить setContentView(R.layout.mLayout)
из вашей деятельности и установите тему как android:theme="@style/AppTheme.Transparent"
. Проверьте эту ссылку для получения более подробной информации.
Наряду с решением gnobal, приведенным выше, мне пришлось установить альфа равным0 в файле макета этого конкретного действия, потому что на определенном телефоне (Redmi Narzo 20 pro, работающем на Android 10) диалоговая часть экрана отображалась с экраном, который был должен быть прозрачным. По какой-то причине windowIsFloating вызывало эту проблему, но после его удаления я не получил желаемого результата.
Шаги:
Добавьте следующее в style.xml, расположенный в res > values > styles.xml
<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> <item name="android:colorBackgroundCacheHint">@null</item> </style>
Установите тему действия с указанным выше стилем в AndroidManifest.xml.
<activity android:name=".activityName" android:theme="@style/Theme.Transparent"/>
Откройте файл макета действия, к которому вы применили вышеуказанный стиль, и установите его альфа-значение на 0 (
android:alpha="0"
) для родительского элемента макета.<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="0"> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="0"/> </androidx.constraintlayout.widget.ConstraintLayout>
Обратите внимание: вам нужно будет расширить свою активность с помощью класса Activity(), а не AppCompatActivity для использования вышеуказанного решения.