web-dev-qa-db-fra.com

Android: Comment définir par programme le thème d'une activité sur Theme.Dialog

J'ai donc un Activity (disons TestActivity) qui doit agir comme un Activity non traité normal ainsi qu'un Theme.Dialog à un autre endroit. J'essaie de réutiliser le même TestActivity pour les deux tâches.

Tout ce que je recherche pour définir le thème de manière dynamique . Le code est simple: Voici la onCreate de mon activité qui fonctionne avec un arrière-plan noir

public void onCreate(Bundle icicle) {
    if (Utility.isDialog == true)
        setTheme(Android.R.style.Theme_Dialog);
    super.onCreate(icicle);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
.....

et voici l'entrée du manifeste

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

Et entre-temps, j'ai trouvé un article qui dit que cela ne peut pas être fait, c'est l'article http://code.google.com/p/Android/issues/detail?id=4394 .Mais il fort sentiment que cela peut être fait.

Toutes les suggestions sont les bienvenues.

37
100rabh

Voudrais donner un moyen de contourner ce problème.

Problème: comment utiliser la même activité en tant que boîte de dialogue et en plein écran.

Solution : 

  1. Définissez votre activité dans votre AndroidManifest.xml avec le thème @Android:style/Theme.Dialog
  2. Dans votre fichier .Java respectif, recherchez une intent extra qui définit le mode dialog
  3. S'il n'existe pas, définissez la Theme sur Android.R.style.Theme. Il s'agit de la variable theme par défaut qui est appliquée si vous ne définissez aucun thème.

Code:

boolean fDialogMode = getIntent().hasExtra("dialog_mode");

if( ! fDialogMode ) {
    super.setTheme(Android.R.style.Theme);
}

Solution alternative:

Une solution plus complexe consiste à utiliser AlertDialog comme ci-dessous:

  1. Définissez une classe ListAdapter étendue à partir de ArrayAdapter
  2. renvoyer 1 dans la fonction getCount

    @Override
    public int getCount() { return 1; }
    
  3. Dans la fonction getView, inflate la layout de la activity dont vous avez besoin et effectuez toute personnalisation avant de retourner la 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;
    }
    

Ceci est certainement une option de second choix si vous ne faites pas trop de traitements dans la variable activityclass, cela pourrait être une option.

La seule raison de considérer cette solution pourrait être que la logique pour l'afficher dans une dialog est isolée aux endroits où elle est utilisée comme dialogue.

Les deux options ont fonctionné pour moi, mais pour des raisons évidentes, je prends la première option. :-)

53
Deepak G M

vous pouvez utiliser setTheme(..) avant d'appeler setContentView(...)et super.oncreate() et cela devrait fonctionner correctement

45
Ahmed Salem

Comme plusieurs autres, les appels à setTheme dans onCreate (avant ou après mon appel à super.onCreate) ne fonctionnaient pas. Cependant, en redéfinissant setTheme, j'ai pu spécifier un thème autre que celui indiqué dans Manifest.xml. Plus précisément, les éléments suivants ont fonctionné sans problème:

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

J'ai trouvé ce qui précède dans la discussion à l'adresse: https://code.google.com/p/Android/issues/detail?id=4394

11
user3570982

Appelez Activity.setTheme() in onCreate() avant d'appeler setContentView().

10
Reuben Scratton

utilisez setTheme avant d'appeler super.onCreate(savedInstance)

3
Mohammad Abu Hmead

Cela peut ne pas être applicable dans votre situation, mais vous pouvez utiliser le thème:

Theme.Holo.DialogWhenLarge

et il affichera votre activité sous forme de boîte de dialogue lorsque l'écran est grand et d'activité régulière lorsque l'écran est petit ..__ Ceci est couvert dans la documentation Android sur Dialogs et contient également des informations sur la programmation d'un dialogue qui peut aussi Sun en tant que fragment plein écran.

0
Xebozone