11
votes

Utilisation de vues personnalisées dans XML sans utiliser de nom de classe entièrement qualifié

J'ai mon propre style pour les boutons définis comme des thèmes, mais j'utilise également ma propre classe pour gérer les boutons (en raison de polices de caractères). Est-il possible d'appeler mon bouton avec un joli nom tel que xxx

au lieu de xxx


0 commentaires

4 Réponses :


-1
votes

non. Vous devez donner un "chemin complet" à votre classe, sinon le cadre ne sera pas capable de gonfler votre mise en page.


3 commentaires

Je pensais qu'il serait peut-être possible de définir une ressource dans XML qui aurait cette classe en tant que parent. N'est-ce pas?


@KCoppock Réponse montre comment aider le cadre avec la recherche, mais je suis loin de voir un bénéfice réel ici. Compilation plutôt entretien.


@Marcinorlowski en interne, la réflexion sera utilisée pour gonfler une vue personnalisée si vous ne fournissez pas de layoutinflater. Je dirais donc que cela devrait améliorer les performances (bien que je doute que ce soit une amélioration notable), mais je conviens que cela ajoute quelques frais généraux.



15
votes

Alors la réponse, étonnamment, est "oui". J'ai appris à ce sujet récemment et c'est en fait quelque chose que vous pouvez faire pour rendre votre inflation personnalisée plus efficace. Intellij vous avertit toujours que c'est invalide (bien que cela compilait et courait avec succès) - Je ne sais pas si Eclipse vous avertit ou non.

Quoi qu'il en soit, ce que vous aurez besoin de faire est de définir votre propre sous-classe de < code> layoutinflater.factory : xxx

puis, dans une activité ou dans le contexte dans lequel vous gonflez une mise en page contenant ces vues personnalisées, vous aurez besoin de Pour attribuer votre usine au Layoutinflater pour ce contexte: xxx

Vous pouvez ensuite utiliser le nom de classe simple dans votre XML: < Pré> xxx


5 commentaires

Eclipse me dit qu'il n'y a pas de layoutinfler.factory


@Ragnar Il y a été là depuis API 1 ( développeur.android.com/reference / Android / View / ... ). Avez-vous ajouté la bonne importation pour cela?


trouvé, je devais juste importer Android.View.LayOUTInflater


Réponse intéressante, mais pourquoi est-ce plus efficace que d'utiliser un nom pleinement qualifié? Modifier: Nevermind, vous avez répondu en dessous de la réponse de Marcin. Sans cette réflexion sera utilisée, ce qui serait - bien que minuscule - amélioration


@wasyl évite juste à l'aide de la réflexion pour rechercher le constructeur (puisque vous l'invoquez directement de cette façon). Pas une énorme différence dans le schéma de choses depuis que je crois que cela met en cache les constructeurs pendant toute de toute façon. Je ne mettrais pas en œuvre cela juste pour des raisons d'efficacité. :)



1
votes

Vous pouvez également faire cela:

<view
  class="com.wehavelongdomainname.android.ui.MyButton" 
  ... />


3 commentaires

Vraiment? Cela fonctionne aussi sur la sucette? C'est un nouveau :)


@milosmns Je ne pense pas que ce soit nouveau en général. (Peut-être que vous vouliez dire nouveau pour vous?)


Oui, je ne l'ai pas utilisé auparavant. Bon!



1
votes

Définition de votre propre sous-classe de layoutinfler.Factory me semble beaucoup de travail. Simplifie simplement l'activité OnCreateView () avec un code générique de l'activité:

if (view == null) {
   if (-1 == name.indexOf('.')) {
      view = onCreateView(parent, name, attrs);
   } else {
      view = createView(name, null, attrs);
   }
}


0 commentaires