webentwicklung-frage-antwort-db.com.de

Überschreiben Sie die Layout-XML aus dem Android-Framework

Problem

Ich möchte eine Layoutdatei aus dem Android-Namespace überschreiben, z. R.layout.popup_menu_item_layout (der wird vom Code als com.Android.internal.R.layout.popup_menu_item_layout referenziert). Indem ich override sage, gehe ich davon aus, im Projekt eine xml -Datei zu deklarieren, die gegenüber dem Layout, das das Framework besitzt, Priorität hat.

Beachten Sie, dass dies nur ein Beispiel für ein Layout ist. Die Frage bezieht sich also auf jedes Layout, das sich im sdk/platforms/Android-XX/data/res/layout-Verzeichnis befindet.

Was ich versucht habe

tools: überschreiben

Es steht ein undokumentiertestools:override-Tag zur Verfügung, das bestimmte Ressourcen überschreibt. Siehe this answer für ein Beispiel, das Werte aus Design Support Library , not aus dem Android-Framework überschreibt.

Das Anwenden von tools:override="true" auf das Root-Tag des Layouts wird nicht wirksam.


XML-Layoutreferenzen - refs.xml

Wie in this post beschrieben, deklarieren Sie eine refs.xml-Datei im /values/-Verzeichnis mit folgendem Inhalt:

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

wird sich auf activity_second.xml beziehen, sobald activity_main.xml verwendet wird. Es gibt eine Antwort , die die Verwendung dieser Technik vorschlägt, um das Layout von Snackbar zu ersetzen.

Dies wird auch nicht wirksam.

Frage

Gibt es eine legitime Möglichkeit, eine Layoutdatei aus dem Android-Paket zu überschreiben/zu ersetzen?

26
azizbekian

Ich weiß, dass dies eine alte Frage ist, aber ich wollte auch ein Bibliothekslayout mit meinem eigenen überschreiben.

Das fragliche Layout wurde design_bottom_navigation_item genannt.

In refs.xml habe ich folgendes hinzugefügt:

<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>

Es gibt 4 Teile, die ich erklären werde.

  • Name : Dies ist der Name des Layouts, das Sie überschreiben möchten
  • Typ : Der Typ der Ressource, die Sie überschreiben möchten, in diesem Fall ein Layout.
  • tools: override : So weisen Sie Android Studio an, das Bibliothekslayout mit Ihrem eigenen zu überschreiben. 
  • Value : Hier legen Sie fest, welche Ressource Sie verwenden möchten.

Sie können dies mit jedem Ressourcentyp auf diese Weise tun.

2
Scott Cooper

Was willst du damit zu tun?

Wenn die Idee, wie das Menüelement aussehen soll, nur ersetzt werden soll, können Sie Folgendes versuchen:

  1. Erstellen Sie einen benutzerdefinierten MyMenuAdapter extends MenuAdapter
  2. Überschreiben Sie die getView -Methode, um die Ansicht von Ihrem Adapter zurückzugeben.
0
Gaurav Vaish

Sie versuchen, zur Laufzeit Ihre SDK in der Anwendung selbst anzupassen.

So funktioniert es einfach nicht. 

Wenn Sie ein SDK für Ihr Projekt verwenden (für beliebige Technologien) und Sie müssen einige Verhaltensweisen ändern, müssen Sie dieses SDK anpassen und anschließend Ihr Projekt mit dieser angepassten News-Version übersetzen.
Der Versuch, es zur Laufzeit zu ändern, ist keine gute Idee.
Sie werden mit mehreren Problemen konfrontiert (Retro-Kompatibilität, Sicherheitsauslöser, -H&OUML;HEN Inkompatibilität, Abhängigkeitsproblem usw.).

Sie haben 4 Möglichkeiten, was Sie wollen:

  1. Erstellen Sie Ihr eigenes Android-Rom, auf das Sie Ihre Modifikation anwenden
  2. Kopieren Sie die Ressourcen, die Sie auf einem gefälschten xmlObject ändern müssen, mit dem Tag. Nach dem onPostCreate Ihrer Anwendung können Sie die Inflation ändern. Sie können dieses Verhalten verallgemeinern und es wird eine Sdk-Überlagerung simuliert.
  3. Machen Sie Ihre eigene SDK :)
  4. Mehrebenenreflexion, aber mit einer stabilen Version gelingt Ihnen auf keinen Fall

Natürlich ist keine dieser Lösungen für eine öffentliche App anwendbar.

0
Antoine Draune