Android: comment programmer le thème d'une activité.Dialogue

Donc j'ai un Activity (disons TestActivity), qui doit agir comme un normal unthemed Activity ainsi qu'une Theme.Dialog à l'autre endroit. Je suis en train d'essayer de réutiliser les mêmes TestActivity pour les deux tâches.

Tout ce que je cherche pour définir le thème dynamiquement. Le code est simple: Voici mon activité onCreate cela fonctionne avec un fond 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 le Manifeste de l'Entrée

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

et en attendant j'ai trouvé un post qui dit que ça ne peut pas être fait ici est le post http://code.google.com/p/android/issues/detail?id=4394 .Mais il y a un fort sentiment que cela peut être fait.

Toutes les suggestions sont les bienvenues.

35
demandé sur Jack A. 2011-02-11 13:24:36

9 réponses

Voudrais donner un travail autour de ce problème.

problème: comment utiliser la même activité que la boîte de dialogue et le plein écran basé.

Solution:

  1. Définissez votre activité dans votre AndroidManifest.xml avec le thème @android:style/Theme.Dialog

  2. Dans votre .Java fichier, vérifiez que intent extra qui définit dialog mode.

  3. Si elle n'existe pas, définissez Theme pour android.R.style.Theme. C'est la valeur par défaut theme qui s'applique 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 est d'utiliser AlertDialog comme ci-dessous:

  1. Définir ListAdapter classe étendue de ArrayAdapter.
  2. retour 1getCount function

    @Override
    public int getCount() { return 1; }
    
  3. Dans le getView fonction inflatelayout de la activity vous avez besoin et faites n'importe quelle personnalisation avant de retourner le 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;
    }
    

C'est certainement une deuxième option de choix, si vous ne faites pas trop de traitement dans le activityclass cela pourrait être une option.

une Seule raison de considérer cette solution pourrait être que la logique de le montrer dans un dialog est isolé aux endroits où il est utilisé comme dialogue.

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

51
répondu Deepak G M 2017-03-22 15:51:48

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

45
répondu Ahmed Salem 2011-10-13 10:23:41

comme plusieurs autres, appels à me mettre en onCreate (avant ou après mon appel à super.onCreate) n'a pas fonctionné. Cependant, en dépassant setTheme, j'ai pu spécifier un thème autre que celui indiqué dans Manifest.XML. Plus précisément, ce qui suit a 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é ci-dessus dans la discussion sur: https://code.google.com/p/android/issues/detail?id=4394

11
répondu user3570982 2014-04-25 20:08:59

Appel Activity.setTheme()onCreate() avant d'appeler setContentView().

10
répondu Reuben Scratton 2011-02-11 10:48:11

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

3
répondu Mohammad Abu Hmead 2017-03-23 07:30:10

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

Theme.Holo.DialogWhenLarge

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

0
répondu Xebozone 2014-12-15 22:38:55

thème par Défaut de la bibliothèque de l'appel:

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

dans mon cas J'utilisais le thème AppCompat, alors assurez-vous que sur votre id vous référez la bibliothèque appropriée (i.e.):

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

0
répondu Victor R. Oliveira 2017-11-19 02:16:40

setTheme (android.R. style.Theme_Dialog);

-1
répondu Dan 2013-09-04 12:45:30

je sais que je suis en retard mais je tiens à poster une solution ici:

vérifiez le code source complet ici. C'est le code que j'ai utilisé pour changer de thème...

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);
}
-1
répondu dondondon 2015-10-24 16:37:36