Welcher Teil von Android ist verantwortlich für die Auswahl eines korrekten Ressourcenprofils?

8

Ich habe ein seltsames Problem.

Bevor Sie auf eine Idee kommen, um mich anzugreifen, arbeite ich an einer benutzerdefinierten Jelly Bean. Daher können die "üblichen netten Ansätze" hier nicht funktionieren, und es müssen schmutzige Umgehungslösungen gemacht werden.

Ich habe ein APK, das in Assets folgendes enthält:

%Vor%

Und einige andere Metriken haben das zurückgegeben:

%Vor%

Wenn man sich also die Metriken anschaut, warum wird layout-large-xhdpi nicht geladen?

Bitte sagen Sie mir, wo ich nachsehen kann. Ich muss wirklich eine Möglichkeit finden, das Layout / Ressource / AssetManager zu zwingen, ein bestimmtes Layout zu laden.

Ich bin mir bewusst, dass der beliebteste Kommentar zu diesem Thema "Sie brauchen nicht / warum haben Sie layout-xhdpi , sollten Sie drawable-xhdpi und layout-large " aber, mit mir.

Ich würde sehr schätzen, auch kleine Hinweise, wo zu sehen, und was zu suchen. Bis jetzt scheint AssetManager der Ort zu sein, an dem man graben / loggen kann.

Wenn ich layout-mdpi weglasse, stürzt die Anwendung bei mir mit fehlenden Ressourcen ab. Der Fehler scheint zu sein, dass, obwohl der Code xhdpi zurückgibt, er an anderer Stelle mdpi annimmt. Ich muss das finden und beheben, damit meine Apps so gut aussehen wie auf ICS:)

Ich finde heraus, welches Layout auf einfache Weise geladen wird - alle root-Layouts haben ein android:tag -Element, und wenn ich setContentView(R.layout.main_layout) habe, schnappe ich mir das Tag im Root-Element und weiß, welcher Ordner geladen wurde. Abgesehen von der visuellen Rückmeldung muss dies letztendlich mit meiner Gerätekonfiguration übereinstimmen.

Vielen Dank im Voraus.

    
Shark 26.02.2013, 11:09
quelle

3 Antworten

3

Interessantes Problem. Ich habe es mir angesehen, aber es geht alles ein bisschen in den Kaninchenbau. Keine Antwort als solche, aber vielleicht wird meine Analyse dich in die richtige Richtung bringen.

Ich habe geschaut, was von setContentView forwards passiert ist. Offensichtlich sprechen Sie zu diesem Zeitpunkt von einer dichte-agnostischen Layout-Referenz (z. B. R.layout.main_layout ) und werden später in eine Referenz auf eine bestimmte Datei in der APK umgewandelt. Wann und wo ist deine Frage.

Ich habe Landscape / Portrait Qualifiers verwendet, um die Qualität zur Laufzeit zu ändern, und ich habe einen Debugger mit der Android-Quelle verwendet.

Hier ist ein Fluss, der etwas in ihn hineingeht.

  1. Resources.getLayout (int)
  2. Resources.loadXmlResourceParser (int, String)
  3. Resources.getValue (int, TypedValue, boolean)
  4. AssetManager.getResourceValue (int, int, TypedValue, boolean)
  5. StringBlock.get (int)
  6. StringBlock.nativeGetString (int, int)

Lass uns rückwärts arbeiten.

Schritt 6 ist eine native Methode (C), die die qualifizierte Referenz, z. %Code%. Sein Parameter ist jedoch ein Index, und dieser ändert sich abhängig davon, ob wir im Quer- oder Hochformat sind.

Um zu sehen, woher das kommt, müssen wir zu Schritt 4 zurückgehen. Der Index ist ein Feld innerhalb des TypedValue, aber er ist anfänglich nicht korrekt eingestellt, wenn er an diese Methode übergeben wird.

Schritt 4 ruft eine andere native Methode /res/layout-land/yourview.xml auf, die den übergebenen TypedValue ändert und den Index entsprechend einstellt.

Vielleicht kannst du anfangen, das C dafür zu betrachten und zu sehen, wie du weiterkommst.

    
Rob Pridham 06.03.2013, 19:38
quelle
4

Es gibt so viele gehackte Geräte auf dem Markt wie Micromax Funbook , die eine große Bildschirmgröße haben, aber die mdpi-Ressourcen verwenden Vertrauen Sie mir, ich habe mit ihnen gearbeitet und es war sehr frustrierend.

Wie Sie bereits erwähnt haben, funktioniert Ihre App gut mit jedem anderen Gerät, das mit diesem Tablet nicht funktioniert. Sie müssen möglicherweise eine solche Lösung hier veröffentlichen

Ссылка

Sie müssen das letzte Segment auf dieser Seite lesen, es wird sicherlich helfen.

Um es hier zusammenzufassen, ist der vorgeschlagene Ansatz, ein separates Layout mit dem anderen Namen zu erstellen, indem die verschiedenen Ressourcen zusammen verwendet werden.

Sie steuern hier den Ressourcenauswahlprozess, nicht das System. Das kann zeitaufwendig sein, wird aber sicherlich helfen.

%Vor%     
Aashish Bhatnagar 07.03.2013 05:41
quelle
1

Ich weiß nicht, ob ich Sie richtig verstehe, Sie erstellen ein benutzerdefiniertes AndroidOS und möchten, dass dieses benutzerdefinierte AndroidOS immer dieselbe Layout-Ressource lädt, in Ihrem Fall layout-large-xhdpi?

Wenn dem so ist, denke ich, dass Sie die Konfigurationsklasse . Wenn Sie es schnell und schmutzig wollen, könnten Sie vielleicht die int-Konstanten in Zeile 72 und darunter überschreiben.

Beton, ändern:

%Vor%

zu:

%Vor%

Eine andere Möglichkeit könnte sein, den Konstruktor und die setToDefaults () - Methode zu überschreiben, so dass immer das selbe Bildschirmlayout geladen wird.

Ich habe es nicht ausprobiert, ich weiß nicht, ob es funktioniert, und ich habe keine glaubwürdigen und / oder offiziellen Quellen (Ausgeschlossener offizieller Android-Code), aber ich hoffe, ich könnte Ihnen helfen.

    
Philipp Kuntschik 01.03.2013 09:51
quelle