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
.Javafichier, vérifiez queintentextra qui définitdialogmode. - Si elle n'existe pas, définissez
Themepourandroid.R.style.Theme. C'est la valeur par défautthemequi 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
ListAdapterclasse étendue deArrayAdapter. retour
1getCountfunction@Override public int getCount() { return 1; }Dans le
getViewfonctioninflatelayoutde laactivityvous 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 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. : -)
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);
}