2011-02-11 15 views
35

Así que tienen un Activity (digamos TestActivity), que tiene que actuar como un unthemed normales Activity, así como un Theme.Dialog en otro lugar. Estoy tratando de reutilizar el mismo TestActivity para ambas tareas.Android: Cómo establecer mediante programación el tema de una actividad para Theme.Dialog

Todo lo que busco es configurar el tema dinámicamente. El código es simple: Aquí está de 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 de manifiesto

<activity android:name=".TestActivity"/> 

Y, mientras tanto, me encontré con un post que dice que puede 't se hace aquí es la publicación http://code.google.com/p/android/issues/detail?id=4394. Pero hay una fuerte sensación de que se puede hacer.

Todas las sugerencias son bienvenidas.

+0

¿Debo aceptar que hay ** ninguna solución ** a esta pregunta como esta [post] (http://code.google.com/p/android/issues/detail? id = 43 94) dice? – 100rabh

Respuesta

51

Me gustaría dar una vuelta de este problema.

Problema: Cómo usar la misma actividad tanto para el diálogo como para la pantalla completa.

Solución:

  1. definir su actividad en su AndroidManifest.xml con el tema @android:style/Theme.Dialog
  2. en su respectivo archivo .Java, compruebe si hay un extra intent que define el modo de dialog.
  3. Si no existe, configure Theme en en android.R.style.Theme. Este es el predeterminado theme 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 utilizar AlertDialog de la siguiente manera:

  1. definir una clase ListAdapter extendido desde ArrayAdapter.
  2. retorno 1 en función getCount

    @Override 
    public int getCount() { return 1; } 
    
  3. En la función getView, inflate la layout del activity que necesita y hacer cualquier personalización antes de devolver el view.

    @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; 
    } 
    

Esto es definitivamente una segunda opción de elegir por si usted no está haciendo demasiado procesamiento en el activityclass que esto podría ser una opción.

El único motivo para considerar esta solución podría ser que la lógica para mostrarlo en un dialog está aislada de los lugares donde se usa como un cuadro de diálogo.

Las dos opciones me funcionaron, pero por razones obvias, estoy tomando la primera opción. :-)

+0

¡Gran explicación, gracias! Si alguien no lo consigue la primera vez (como yo: D), primero lea la solución @mozarty para entender dónde exactamente debe poner este código. –

10

Llame Activity.setTheme() en onCreate() antes de llamar al setContentView().

+2

aunque Reuben funciona (y lo he intentado antes también), pero veo Black Background en lugar de la Actividad de llamada – 100rabh

+0

Entonces las propiedades de tu tema son incorrectas. ¿Cuál es tu android: windowBackground establecido en? –

+0

Reuben No he definido un estilo personalizado. Pero ahora implementaré un estilo personalizado con windowBackground para color/transparente – 100rabh

45

puede utilizar setTheme(..) antes de llamar setContentView(...) y super.oncreate() y debería funcionar bien

+0

lee la pregunta nuevamente ya está escrita allí – 100rabh

+0

no estás llamando a setContentView, y sé que se puede hacer porque lo hice en mi actividad –

+4

Moviendo la llamada a setTheme antes de que el super.onCreate lo hiciera funcionar para mí, gracias ! –

3

uso setTheme antes de llamar super.onCreate(savedInstance)

-1

setTheme (android.R.style.Theme_Dialog);

10

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. En concreto, el siguiente funcionó sin problemas:

@Override 
public void setTheme(int resid) { 
    boolean changeTheme = true; 
    super.setTheme(changeTheme ? android.R.style.Theme_Dialog : resid); 
} 

me encontré con lo anterior, en la discusión en: https://code.google.com/p/android/issues/detail?id=4394

+1

Sin embargo, con Android invocando setTheme() antes de la llamada onCreate(), uno no puede usar los datos normalmente enviados a una actividad para decidir si cambiar el tema Se necesita algo de hack adicional para tomar esa decisión. –

0

Esto puede no ser aplicable en su situación, pero se puede utilizar 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 cuadro de diálogo que también puede tomar el sol como un fragmento de pantalla completa.

-1

sé que llego tarde, pero me gustaría poder escribir una solución aquí:

Comprobar el código fuente completo here. Este es el código que utilicé cuando se cambia 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); 
} 
0

biblioteca del tema por defecto llamada:

super.setTheme(android.R.style.Theme); 

En mi caso yo estaba usando AppCompat temático, así que asegúrese de que en su identificación que se refieren al biblioteca adecuada (es decir,):

super.setTheme(android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar);

Cuestiones relacionadas