ActionBar dans un DialogFragment
Dans l'application Calendrier sur mon Galaxy Tab 10.1, lors de la création d'un nouvel événement, une boîte de dialogue apparaît avec Fait et Annuler les boutons dans la barre de titre/action bar.
Je tiens à l'appliquer dans mon application. J'ai essayé d'utiliser setHasOptionsMenu(true)
en plus impérieuses onCreateOptionsMenu
dans mon DialogFragment
sous-classe, mais mon action éléments n'apparaissent pas. J'ai aussi essayé d'appeler getDialog().getActionBar()
de l'intérieur onCreateView
mais il renvoie toujours null
.
Je suis en mesure d'obtenir ce travail si je démarre une Activity
plutôt que d'afficher une boîte de dialogue, mais qui prend tout l'écran. Est-il un moyen standard pour ce faire à l'aide d'un DialogFragment
?
- C'est probablement une activité dessiné pour ressembler à une boîte de dialogue au lieu d'un "véritable dialogue".
- "la plupart des dernières fonctionnalités sont ajoutées à la bibliothèque de prise en charge de la version de la Barre d'outils, et ils sont disponibles sur n'importe quel appareil qui peut utiliser la bibliothèque de prise en charge. Pour cette raison, vous devez utiliser la bibliothèque de prise en charge de la Barre d'outils de la classe pour mettre en œuvre de vos activités barres d'application." developer.android.com/training/appbar/setting-up
Vous devez vous connecter pour publier un commentaire.
à l'aide de l'idée d'un google group post j'ai été en mesure de le retirer de style d'une activité. vous souhaitez modifier la hauteur et la largeur d'une "dynamique" de la taille de votre choix de préférence. Ensuite, réglez boutons ActionBar vous souhaitez
--
res/values-XX/syles.xml
si vous êtes encore en train de la valeur par défaut holo thème.onCreate(...)
appel de la méthodeshowAsPopup()
(vous pouvez omettre le paramètre et utilisezthis
puisque c'est une méthode de la même classe d'Activité) immédiatement après lasuper.onCreate(...)
appel.activity.setContentView(R.layout.activity_main);
Si vous utilisez ActionBarSherlock, déclarer le thème comme ci-dessous:
Et, d'initialiser un SherlockActivity avec PopupTheme selon Luc Sleeman réponse.
Résultat:
Eu quelques difficultés à mettre en œuvre les solutions proposées à partir de StrikeForceZero et Luc Sleeman, donc j'ai voulu contribuer à mon expérience. Je suis sûr qu'il ya juste quelque chose qui me manque, donc la rétroaction serait très apprécié.
Ce que j'ai fait est le suivant:
Créer un style à l'aide du PopupTheme, directement copier/coller:
Ajouter le showAsPopup() la méthode comme une méthode dans le fragment qui permettrait d'ouvrir le faux dialogue fragment, directement copier/coller:
Créer une instance de la nouvelle activité à l'aide d'un simple appel, et puis la passer à la showAsPopup() méthode:
Pour le but de la tester (j'essayais juste pour confirmer que je pouvais ouvrir une activité qui est présenté comme un dialogue avec une barre d'action), j'ai utilisé une très simple test, volé directement à partir du bouton api d'affichage de démonstration (pour le fichier de mise en page, voir buttons_1.xml dans l'api démos):
Malheureusement, à chaque fois que j'ai essayé ceci, j'obtiens une quelconque exception de pointeur null sur le premier appel, l'activité.requestWindowFeature(Fenêtre.FEATURE_ACTION_BAR);
Comme vous pouvez le voir à partir de la trace de la pile, le comportement attendu est d'ouvrir la fenêtre sur un appui long sur une GoogleMap instance (à l'aide de la MapFragments de l'API 2). Donc, ma première pensée a été qu'il y avait un problème en essayant de l'ouvrir à partir d'un Fragment, donc j'ai passé l'appel vers le propriétaire de l'Activité. Même erreur, même pas de renseignements supplémentaires.
Ma meilleure supposition à ce point était qu'un nouveau() l'appel n'a pas suffisamment d'instancier la classe/vue pour faire des appels à modifier son point de vue. S'avère que cela semble être au moins un peu vrai, que la migration de la vue de la modification du code dans l'activité et simplement l'ouverture de l'activité d'une façon normale de travaux:
Appelant activité:
Nouveau code de classe:
Donc je suppose que le point de moi de poster tout cela est à préciser que si vous voulez faire ce que les affiches ci-dessus l'indique, vous ne pouvez pas nouveau() une activité et appelez showAsPopup(). C'est peut-être mon inexpérience avec Android montrant à travers, mais tout cela semble un peu évident, il semble naturel d'interpréter showAsPopup() que d'être appelé par le point de vue actuel, non de la vue en cours de création, que vous êtes de passage dans l'instance d'activité (ce qui serait juste ce si il était censé être fait dans onCreate() comme j'ai fait).
Donc, si l'intention est d'appeler showAsPopup() dans le la création de de l'activité et non la créé activité, il n'est pas évident comment faire pour obtenir l'instance d'Activité est modifiable avant le onCreate() est appelée. Le problème étant que vous ne pouvez pas appeler les choses comme requestWindowFeature() après setContentView() est appelée (exemple), qui est un problème car il est généralement appelé dans onCreate().
Encore une fois, si il est facile de/meilleure façon de le faire, je serais très heureux de la rétroaction. Espérons que cela est utile pour les personnes qui veulent utiliser cette approche.
showAsPopup(Activity activity)
méthode à un "public static" méthode et ensuite appeler à partir de laonCreate
avant tout (saufsuper.onCreate
.J'ai passé une quantité incroyable de temps à jouer avec cela. La accepté de répondre travaille sur un galaxy nexus 7 (Android 4.2), mais échoue sur un samsung galaxy SIII (Android 4.1) et un samsung galaxy tab 10.2 (Android 4.0), avec l'exception suivante:
Ceci est causé par le code dans ActionBarView.onMeasure(int, int) qui contrôles pour s'assurer de la mise en page est définie à match_parent. La bonne solution est plutôt de régler la largeur de la fenêtre via setLayout au lieu d'utiliser le setAttributes.
C'est une version fixe de showAsPopup (), qui fonctionne sur tous les appareils que j'ai testé sous:
Par souci d'exhaustivité, voici la PopupTheme de nouveau:
Comme Veeti implicite, vous pouvez essayer de mettre en œuvre une Activité avec une boîte de Dialogue Thème. Dans le Manifeste Android:
J'espère que ça va aider.
Je suis probablement pas connu, mais je voudrais utiliser une activité, ajouter les éléments de la barre d'action, puis :
Espère que ça aide!
Theme.Holo.Light.Dialog
et définir laandroid:windowActionBar
attributtrue
. Une fois que je fais ça, j'obtiens une exceptionjava.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layout
.J'ai trouvé une belle façon de le faire , à l'aide de setCustomTitle sur le constructeur de l'alertDialog pour la DialogFragment (également possible sur le alertDialog lui-même).
Et le résultat (à partir de mon application ):
Si vous ne souhaitez pas utiliser AlertDialog, vous pouvez toujours mettre une barre d'outils dans votre mise en page de la boîte de dialogue et l'utiliser.
Je sais que c'est pas la vraie réponse, mais les solutions ci-dessus semblent si peu élégante que l'on pourrait penser qu'il serait plus facile pour éviter la barre d'action, comme d'hériter de votre boîte de dialogue de thème à partir de quelque chose .noActionBar puis créez une vue sur le haut de votre panneau qui imite l'action de la barre, au moins de cette façon, tout reste dans xlm.
DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); getWindow().setLayout(metrics.widthPixels - 80, metrics.heightPixels - 80);