with - ventana emergente android studio
Android: Cómo programar programáticamente el tema de una actividad para Theme.Dialog (9)
Como muchos otros, las llamadas a setTheme en onCreate (antes o después de mi llamada a super.onCreate) no funcionaron. Sin embargo, al anular SetTheme, pude especificar un tema distinto al indicado en Manifest.xml. Específicamente, lo siguiente funcionó sin problemas:
@Override
public void setTheme(int resid) {
boolean changeTheme = true;
super.setTheme(changeTheme ? android.R.style.Theme_Dialog : resid);
}
Encontré lo anterior en la discusión en: https://code.google.com/p/android/issues/detail?id=4394
Así que tengo una Activity
(por ejemplo, TestActivity
) que debe actuar como una actividad normal no temática, así como también un Theme.Dialog
en otro lugar. Estoy intentando reutilizar la misma TestActivity
para ambas tareas.
Todo lo que busco es establecer el tema dinámicamente. El código es simple: aquí está onCreate
mi actividad que funciona con un fondo negro
public void onCreate(Bundle icicle) {
if (Utility.isDialog == true)
setTheme(android.R.style.Theme_Dialog);
super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_NO_TITLE);
.....
y aquí está la entrada del manifiesto
<activity android:name=".TestActivity"/>
Y mientras tanto encontré una publicación que dice que no se puede hacer aquí es la publicación http://code.google.com/p/android/issues/detail?id=4394 Pero hay una fuerte sensación de que puede hacerse.
Todas las sugerencias son bienvenidas
Esto puede no ser aplicable en su situación, pero puede usar el tema:
Theme.Holo.DialogWhenLarge
y mostrará su actividad como un diálogo cuando la pantalla es grande, y como una actividad regular cuando la pantalla es pequeña. Esto está cubierto en la documentación de Android en Dialogs y también contiene información sobre la programación de un Diálogo que también puede utilizarse como un fragmento de pantalla completa.
Llamada a biblioteca de tema predeterminada:
super.setTheme(android.R.style.Theme);
En mi caso, yo estaba usando el tema de AppCompat, así que asegúrese de que en su identificación consulte la biblioteca adecuada (es decir):
super.setTheme(android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar);
Llame a Activity.setTheme()
en onCreate()
antes de llamar a setContentView()
.
Me gustaría dar una vuelta de tuerca para este problema.
Problema: cómo usar la misma actividad tanto para el diálogo como para la pantalla completa.
Solución:
- Defina su actividad en su AndroidManifest.xml con el tema
@android:style/Theme.Dialog
- En tu archivo
.Java
respectivo, busca unintent
adicional que defina el modo dedialog
. - Si no existe, configure el
Theme
enandroid.R.style.Theme
. Este es eltheme
predeterminado que se aplica si no define ningún tema.
Código:
boolean fDialogMode = getIntent().hasExtra("dialog_mode");
if( ! fDialogMode ) {
super.setTheme(android.R.style.Theme);
}
Solución alternativa:
Una solución más compleja es usar AlertDialog
siguiente manera:
- Defina una clase
ListAdapter
extendida desdeArrayAdapter
. return
1
en la funcióngetCount
@Override public int getCount() { return 1; }
En la función
getView
,inflate
ellayout
de laactivity
que necesita y realice cualquier personalización antes de devolver laview
.@Override public View getView( int position, View view, ViewGroup group ) { View v = view; if( v == null ) { v = getSystemService(Context.LAYOUT_INFLATER_SERVICE).inflate( <layout res id>, null ); } ... Do any customization here .... return v; }
Esta es definitivamente una opción de segunda opción por si no está haciendo demasiado procesamiento en la class
activity
esto podría ser una opción.
La única razón para considerar esta solución podría ser que la lógica para mostrarla en un dialog
esté aislada de los lugares donde se usa como un diálogo.
Ambas opciones funcionaron para mí, pero por razones obvias, estoy tomando la primera opción. :-)
Sé que llego tarde, pero me gustaría publicar una solución aquí:
Compruebe el código fuente completo here . Este es el código que utilicé al cambiar el tema ...
SharedPreferences pref = PreferenceManager
.getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
setTheme(R.style.AppTheme);
} else if (themeName.equals("Colorful Beach")) {
//Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
setTheme(R.style.beach);
} else if (themeName.equals("Abstract")) {
//Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
setTheme(R.style.abstract2);
} else if (themeName.equals("Default")) {
setTheme(R.style.defaulttheme);
}
puede usar setTheme(..)
antes de llamar a setContentView(...)
y super.oncreate()
y debería funcionar bien
setTheme (android.R.style.Theme_Dialog);
use setTheme
antes de llamar a super.onCreate(savedInstance)