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.
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:
- Définissez votre activité dans votre AndroidManifest.xml avec le thème
@android:style/Theme.Dialog
- Dans votre
.Java
fichier, vérifiez queintent
extra qui définitdialog
mode. - Si elle n'existe pas, définissez
Theme
pourandroid.R.style.Theme
. C'est la valeur par défauttheme
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:
- Définir
ListAdapter
classe étendue deArrayAdapter
. retour
1
getCount
function@Override public int getCount() { return 1; }
Dans le
getView
fonctioninflate
layout
de laactivity
vous avez besoin et faites n'importe quelle personnalisation avant de retourner leview
.@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 activity
class
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. : -)
vous pouvez utiliser setTheme(..)
avant d'appeler setContentView(...)
et super.oncreate()
et ça devrait fonctionner
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
Appel Activity.setTheme()
onCreate()
avant d'appeler setContentView()
.
utiliser setTheme
avant d'appeler super.onCreate(savedInstance)
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.
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);
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);
}