6
votes

Imprimer une hiérarchie de vue sur un appareil

Débogage de mon application avec des résultats étranges sur les téléphones Samsung, que je n'ai pas d'accès physique à. J'aimerais demander à un utilisateur d'exécuter une application instrumentée pour vous aider à déboguer. Mon application reçoit une vue qui a un inconnu (à moi ;-) Hiérarchie de celui-ci ( Groupes de vue etc.). Existe-t-il un moyen de "marcher" A et d'imprimer sur une chaîne / DDMS Tous les composants de la vue (etc Groupes de vue , etc.)?

Ceci serait semblable à HierarchyViewer Outil - Si j'avais adb Accès au niveau de l'appareil. < P> MISE À JOUR: Je suppose que je pourrais utiliser la méthode xxx

à partir du ViewDebug.java Sources OS Android ...

Quelqu'un a une meilleure idée?

merci!


0 commentaires

6 Réponses :


0
votes

Ces vues ne sont pas les miennes, elles viennent d'autres applications, je ne peux donc pas toucher le code que celui-ci (je les gonfle d'un téléviseur)

Si vous recevez un RemoteViews , et que vous l'appliquez à quelque chose dans votre activité, vous avez un accès direct au des vues , pas différent de ce que vous aviez les gonflés de XML vous-même. Compte tenu de la page racine , il s'agit simplement d'une question de marche des enfants (probablement de la profondeur - d'abord, mais c'est votre appel) et enregistrez toutes les informations que vous souhaitez.


1 commentaires

C'est en fait ce que j'ai fait. Ce que je cherchais est une classe ou une bibliothèque qui fournit cette fonctionnalité "pré-conserve". Je me suis levé de certains codes dans la source Android pour ViewDebug et faisait essentiellement ce que vous appelez ici.



35
votes

Voici la fonction utilitaire que je viens de faire à cette fin: xxx


2 commentaires

Je ne donnerais que +2 UPS uniquement pour utiliser $ dans les noms de var, je pensais que c'était impossible, jamais essayé.


J'aime cette réponse, mais je le ferais encore mieux en utilisant ce qui suit afin que vous puissiez également imprimer l'identifiant (si disponible): string desc = $ préfixe + "|" + "[" + "[" + " "+ ($ vg.getchildcount () - 1) +"] "+ v.getclass (). GetImplename (); String ID = null; essayez {id = v.getresources (). getresourcename (v.getid ()); } Catch (Exception E) {// No-Op (No Identifiant trouvé)} desc + = "" + (id == null? v.getide (): id);



13
votes

J'ai créé la méthode de l'utilité qui renvoie la hiérarchie d'une manière jolie imprimée avec des identifiants de vue lisible par l'homme. Voici un exemple de la sortie:

public static String getViewHierarchy(@NonNull View v) {
    StringBuilder desc = new StringBuilder();
    getViewHierarchy(v, desc, 0);
    return desc.toString();
}

private static void getViewHierarchy(View v, StringBuilder desc, int margin) {
    desc.append(getViewMessage(v, margin));
    if (v instanceof ViewGroup) {
        margin++;
        ViewGroup vg = (ViewGroup) v;
        for (int i = 0; i < vg.getChildCount(); i++) {
            getViewHierarchy(vg.getChildAt(i), desc, margin);
        }
    }
}

private static String getViewMessage(View v, int marginOffset) {
    String repeated = new String(new char[marginOffset]).replace("\0", "  ");
    try {
        String resourceId = v.getResources() != null ? (v.getId() > 0 ? v.getResources().getResourceName(v.getId()) : "no_id") : "no_resources";
        return repeated + "[" + v.getClass().getSimpleName() + "] " + resourceId + "\n";
    } catch (Resources.NotFoundException e) {
        return repeated + "[" + v.getClass().getSimpleName() + "] name_not_found\n";
    }
}


0 commentaires

0
votes

presque la même chose avec cette réponse mais avec kotlin: xxx


1 commentaires

Voici comment vous imprimez BTW: println (geviewtree (getwindow (getwindow (). getDecorView (). gretrootView () comme groupe de visit))



-1
votes

Il suffit de trouver l'élément de menu de BottorsNavigationView et enregistrez-vous à long clic. XXX


0 commentaires

1
votes

Le format d'autres sorties insatisfait mes yeux et des codes où une surcharge aérienne. Donc, j'ai amélioré la sortie avec: xxx

à: xxx


0 commentaires