17 votes

Comment déboguer une vue personnalisée dans l'éditeur de mise en page graphique de l'ADT ?

Comment déboguer une vue personnalisée dans l'aperçu graphique d'un Layout XML en utilisant le plugin ADT Eclipse ?


J'ai écrit une vue personnalisée, je l'ai placée dans un fichier XML de mise en page et je peux la prévisualiser dans le fichier Éditeur de mise en page graphique ADT . Je peux afficher ma vue personnalisée comme l'ont fait les gars de Google dans Google I/O 2011 : Outils de développement Android . Cependant, ma vue personnalisée se comporte mal dans l'aperçu (pas de problème sur les émulateurs/appareils, mais je n'utilise pas la fonction [View.isInEditMode()](http://developer.android.com/reference/android/view/View.html#isInEditMode()) ). Je pense qu'une variable a une valeur erronée, mais je ne peux pas confirmer. J'ai essayé :

6voto

Pek Ifly Points 79

Bonne question ! Je me pose la même question. Avoir un bon aperçu dans l'éditeur de mise en page est vraiment très difficile et il semble y avoir assez peu de documentation sur ce que vous pouvez et ne pouvez pas faire lorsque "isineditmode" est vrai (par exemple, analyser les attributs XML personnalisés dans l'AttributeSet entrant sur le constructeur des vues ne semble pas fonctionner, etc, etc.)

J'ai même des problèmes pour trouver des vues par ID dans une vue personnalisée. Une chose simple comme

mTextView = (TextView)myLayout.findViewById(R.id.view_id);

après avoir gonflé ma vue personnalisée, retourne null uniquement lorsque la vue est exécutée à partir de l'éditeur (c.-à-d. isineditmode() == true). Lorsque l'application est exécutée sur un téléphone, elle fonctionne.

Je vous laisse ici ce qui m'a aidé à mieux prévisualiser mes mises en page dans l'éditeur de mise en page :

1- Trouver les points de vue : J'utilise la propriété TAG, car la fonction findViewWithTag() fonctionne en mode édition. J'utilise donc l'Id pour le TAG

<TextView
    android:id="@+id/myTextViewId"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ...
    android:tag="mytextViewId" />

puis trouver les vues à l'aide de la balise :

if(isineditmode()){
    ((TextView)myLayout.findViewWithTag("myTextViewId")).setText("Test text");
}

2- Vérifier certaines valeurs pour savoir pourquoi parfois ma vue personnalisée ne peut pas être instanciée en mode édition, ou vérifier si certaines propriétés peuvent être interrogées en mode édition et connaître leur valeur. . J'utilise une fenêtre de texte spéciale dans le layout parent dans lequel ma vue personnalisée sera placée, et je la laisse cachée et avec une balise spéciale :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > 

    ...

    <com.example.myCustomView ... />

    ...

    <TextView
        android:id="@+id/DebugView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:tag="debug"
        android:textSize="16sp"
        android:textColor="#FFFFFF"
        android:visibility="gone"
     />

</LinearLayout>

Cette disposition linéaire sera le parent de ma vue personnalisée et celle que je dois ouvrir dans l'éditeur de disposition afin de prévisualiser ma vue personnalisée. La visibilité de la vue de texte "debug" est "disparue", je ne la perturberai donc pas si ce n'est pas nécessaire. Ensuite, lorsque j'ai besoin de vérifier quelque chose, je fais ce qui suit dans le code Java de ma vue personnalisée :

if(isineditmode()){
    TextView wDebugView = (TextView)this.getRootView().findViewWithTag("debug");
    wDebugView.setVisibility(View.VISIBLE);
    wDebugView.setText(Integer.valueOf(getPaddingTop()).toString());
}

Dans cet exemple, je vérifie une propriété de la vue, comme le remplissage du haut.

Note importante : vous devez convertir manuellement en chaîne la valeur à afficher dans la vue "debug", sinon le programme se bloquera et vous donnera une erreur.

J'espère que cela vous aidera.

Et si quelqu'un a une idée de la raison pour laquelle la recherche de vues par identifiant ne fonctionne pas, toute aide serait appréciée.

3voto

mwk Points 869

Je reconnais que c'est frustrant. Pour moi, findViewWithTag() ne fonctionne pas, il renvoie toujours null en mode aperçu ADT. Mais j'ai pu mettre en place un simple log vers un fichier local (non Android) et l'utiliser pour déboguer mes vues personnalisées, par exemple comme ci-dessous (ceci vérifie isEditMode pour s'assurer que c'est un no-op en cas d'exécution accidentelle sous Android) :

/** ONLY FOR ECLIPSE: enables us to do some basic logging to a file to debug our custom views in Eclipse preview mode */ 
public static void eclipseEditModeLog(View view, String s) {
    if (view.isInEditMode()) {
        try {
            // Open our hack log file in append mode
            if (eclipseLogOut == null) {
                File eclipseLogFile = new File("/home/mwk/tmp/eclipse.log");
                eclipseLogOut = new BufferedWriter(new FileWriter(eclipseLogFile, true));
            }
            eclipseLogOut.write(new Date().toLocaleString() + ": " + s + "\n");
            eclipseLogOut.flush();
        } catch (IOException e) {}
    }
}
private static BufferedWriter eclipseLogOut = null;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X