¿Cómo creo una Actividad transparente en Android?
android-activity (18)
Hay dos maneras:
- Usando Theme.NoDisplay
- Utilizando Theme.Translucent.NoTitleBar
El uso de Theme.NoDisplay
seguirá funcionando ... pero solo en dispositivos Android más antiguos. En Android 6.0 y superior, utilizando Theme.NoDisplay sin llamar a finish()
en onCreate() (or, technically, before onResume())
bloquee su aplicación. Es por esto que la recomendación es usar Theme.Translucent.NoTitleBar
, que no sufre de esta limitación ".
Quiero crear una Actividad transparente sobre otra actividad.
¿Cómo puedo conseguir esto?
Acabo de hacer dos cosas, y hace que mi actividad sea transparente. Están abajo.
En el archivo de manifiesto, acabo de agregar el siguiente código en la etiqueta de actividad .
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
Y acabo de establecer el fondo del diseño principal para esa actividad como " # 80000000 ". Me gusta
android:background="#80000000"
Funciona perfectamente para mí.
Además de las respuestas anteriores:
para evitar la caída de Android relacionada con Oreo en la actividad
<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" />
Asígnele el tema translúcido.
android:theme="@android:style/Theme.Translucent.NoTitleBar"
Asigne el tema translúcido a la actividad que desea hacer transparente en el archivo de manifiesto de Android de su proyecto:
<activity
android:name="YOUR COMPLETE ACTIVITY NAME WITH PACKAGE"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Con la biblioteca "AppCompat" o la "Biblioteca de soporte de diseño de Android" es un poco diferente:
En el 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>
En el AndroidManifest.xml:
<activity>
android:name=".WhateverNameOfTheActivityIs"
android:theme="@style/Theme.AppCompat.Translucent"
...
</activity>
Declara tu actividad en el manifiesto así:
<activity
android:name=".yourActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
Y añada un fondo transparente a su diseño.
Dice así:
<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
En la función onCreate , debajo de setContentView , agregue esta línea:
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
En mi caso, tengo que establecer el tema en el tiempo de ejecución en java basado en algunas condiciones. Así que creé un tema con estilo (similar a otras respuestas):
<?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>
Luego en Java lo apliqué a mi actividad:
@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);
}
Recuerde un punto importante aquí: debe llamar a la función setTheme()
antes de super.onCreate(savedInstanceState);
. Perdí este punto y estuve atascado durante 2 horas, pensando por qué mi tema no se refleja en el tiempo de ejecución.
La forma más sencilla que he encontrado es establecer el tema de la actividad en AndroidManifest en android:theme="@android:style/Theme.Holo.Dialog"
.
Luego, en el método onCreate de la actividad, llame a getWindow().setBackgroundDrawable(new ColorDrawable(0));
.
Lo logré en 2.3.3 simplemente agregando android:theme="@android:style/Theme.Translucent"
en la etiqueta de actividad en el manifiesto.
No sé sobre versiones inferiores ...
Nota 1: en la carpeta Drawable cree test.xml y copie el siguiente código
<?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>
// Nota: Las esquinas y la forma son según su requerimiento.
// Nota 2: Crear 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>
Para la actividad de diálogo utilizo esto:
getWindow().getDecorView().setBackgroundResource(android.R.color.transparent);
Pero también necesitas configurar tu Vista principal en la actividad a invisible. De lo contrario, el fondo será invisible, mientras que todas las vistas serán visibles.
Quería agregar algo más a esto, ya que también soy un nuevo desarrollador de Android. La respuesta aceptada es genial, pero tuve algunos problemas. No estaba seguro de cómo agregar el color al archivo colors.xml. Así es como debe hacerse:
colores.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="class_zero_background">#7f040000</color>
<color name="transparent">#00000000</color>
</resources>
En mi archivo colors.xml original tenía la etiqueta "dibujable":
<drawable name="class_zero_background">#7f040000</drawable>
Y también lo hice por el color, pero no entendí que la referencia "@ color /" significaba buscar la etiqueta "color" en el XML. Pensé que debería mencionar esto también para ayudar a alguien más.
Solo agregue la siguiente línea a la etiqueta de actividad en su archivo de manifiesto que debe verse transparente.
android:theme="@android:style/Theme.Translucent"
Solo deja que la actividad sea transparente. O agrega el tema en el archivo XML:
<activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Agregue el siguiente estilo en su archivo res/values/styles.xml
(si no tiene uno, res/values/styles.xml
). Aquí hay un archivo completo:
<?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>
(El valor @color/transparent
es el valor de color #00000000
que puse en el archivo res/values/color.xml
. También puede usar @android:color/transparent
en versiones posteriores de Android).
Luego aplique el estilo a su actividad, por ejemplo:
<activity android:name=".SampleActivity" android:theme="@style/Theme.Transparent">
...
</activity>