web-dev-qa-db-fra.com

Ignorer la mise en page XML du cadre Android

Problème

Je souhaite remplacer un fichier de mise en page à partir d'un espace de noms Android, par exemple. R.layout.popup_menu_item_layout (qui est référencé à partir du code as com.Android.internal.R.layout.popup_menu_item_layout). En déclarant override, je suppose en déclarant un fichier xml dans le projet qui serait priorisé par rapport à la présentation que l'infrastructure possède.

Notez qu'il ne s'agit que d'un exemple de présentation. La question concerne donc chaque présentation présente dans le répertoire sdk/platforms/Android-XX/data/res/layout.

Ce que j'ai essayé

tools: override

Il existe une balise undocumentedtools:override disponible, qui remplace des ressources spécifiques. Voir this answer pour un exemple, qui remplace les valeurs de Design Support Library , not du cadre Android.

L'application de tools:override="true" à la balise racine de la présentation ne prendra pas effet.


Références de mise en page XML - refs.xml

Comme décrit dans this post, déclarer un fichier refs.xml dans le répertoire /values/ avec le contenu suivant:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="layout" name="activity_main">@layout/activity_second</item>
</resources>

fera référence à activity_second.xml une fois que activity_main.xml est utilisé. Il y a une réponse qui suggère d’utiliser cette technique pour substituer la disposition de Snackbar.

Cela aussi ne prendra pas effet.

Question

Existe-t-il un moyen légitime de remplacer/substituer un fichier de mise en page à partir du package Android?

26
azizbekian

Je sais que c’est une vieille question, mais je voulais aussi remplacer une disposition de bibliothèque par la mienne. Voici comment je l’ai faite.

La mise en page en question s'appelait design_bottom_navigation_item

Dans refs.xml, j'ai ajouté ce qui suit:

<resources xmlns:tools="http://schemas.Android.com/tools">
    <item name="design_bottom_navigation_item" type="layout" tools:override="true">@layout/bottom_navigation_item</item>
</resources>

Je vais expliquer cela en 4 parties.

  • Nom : Ceci est le nom de la mise en page que vous souhaitez remplacer.
  • Type : Le type de ressource que vous essayez de remplacer, dans ce cas, une présentation.
  • tools: override : Voici comment vous demandez à Android Studio de remplacer la disposition de la bibliothèque par la vôtre. 
  • Valeur : C'est ici que vous spécifiez quelle ressource vous souhaitez utiliser à la place.

Vous pouvez le faire avec n'importe quel type de ressource de cette façon.

2
Scott Cooper

Qu'est-ce que vous essayez de faire?

Si vous ne souhaitez que remplacer l'aspect de l'élément de menu, essayez les solutions suivantes:

  1. Créer un MyMenuAdapter extends MenuAdapter personnalisé
  2. Remplacez la méthode getView pour renvoyer la vue depuis votre adaptateur.
0
Gaurav Vaish

Vous essayez de personnaliser votre sdk sur l'application elle-même, au moment de l'exécution.

Ce n'est pas comme ça que ça fonctionne. 

Si vous utilisez un SDK sur votre projet (quelle que soit la technologie) et que vous deviez modifier certains comportements, vous allez ajuster ce SDK, puis compiler votre projet avec cette nouvelle version personnalisée.
Essayer de le modifier au moment de l'exécution n'est pas une bonne idée.
Vous devrez faire face à plusieurs problèmes (rétro-compatibilité, déclencheur de sécurité, AIGUS incompatibilité, problème de dépendance, etc.)

Vous avez 4 possibilités pour faire ce que vous voulez:

  1. Faites votre propre rom sur Android où vous appliquerez votre modification
  2. Copiez les ressources que vous devez modifier sur un faux xmlObject avec la balise, après le onPostCreate de votre application, vous pourrez modifier le moment de l'inflation. Vous pouvez généraliser ce comportement et simuler une superposition de sdk.
  3. Faites votre propre sdk :)
  4. Réflexion à plusieurs niveaux, mais impossible de réussir avec une version stable

Bien entendu, aucune de ces solutions ne s'applique à une application publique.

0
Antoine Draune