4 votes

Pourquoi getLocationOnScreen() et getLocationInWindow() retournent-ils les mêmes valeurs?

Sur l'émulateur Android 2.1.
Dans une classe de test ActivityInstrumentationtestCase2,
Je vérifie que phototButton est au-dessus de sendButton.

@UiThreadTest public void testViewLocationOnScreen() {
        // Essayer de déclencher la disposition
        activity.findViewById(R.id.rootSnap).forceLayout();
        activity.findViewById(R.id.rootSnap).requestLayout();
        activity.photoButton.getRootView().requestLayout();
        activity.photoButton.requestLayout();
        activity.photoButton.invalidate();
        activity.onWindowFocusChanged(true);  

        // Assertions réussies
        assertTrue(activity.hasWindowFocus());
        ViewAsserts.assertOnScreen(activity.photoButton.getRootView(), activity.photoButton);
        ViewAsserts.assertOnScreen(activity.sendButton.getRootView(), activity.sendButton);
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        Assert.assertTrue(activity.photoButton.isShown());
        Assert.assertTrue(activity.sendButton.isShown());

        // Coordonnées d'écran inattendues renvoyées par 
        // getLocationOnScreen() et getLocationInWindow()
        int[] above = new int[2];
        activity.photoButton.getLocationOnScreen(above);
        int[] below = new int[2];
        activity.sendButton.getLocationOnScreen(below);
        log("getLocationOnScreen-above", above);
        log("getLocationOnScreen-below", below);
        // Enregistre les coordonnées d'écran [0, 76] et [0, 178]

        above = new int[2];
        activity.photoButton.getLocationInWindow(above);
        below = new int[2];
        activity.sendButton.getLocationInWindow(below);
        log("getLocationInWindow-above", above);
        log("getLocationInWindow-below", below);
        // Enregistre les coordonnées de fenêtre [0, 76] et [0, 178]
    }

J'attendais des valeurs différentes de ces méthodes.

Pourquoi getLocationOnScreen() et getLocationInWindow() renvoient-ils les mêmes valeurs ?

4voto

groucho Points 588

J'étais également confus par cela, alors j'ai fait un peu d'investigation que je résume ici.

En gros, la fenêtre se positionne en dessous de la barre d'état (en dessous en ce qui concerne l'ordre z et non les coordonnées y), et remplit généralement tout l'écran. Ainsi, dans une activité normale, vous devriez vous attendre à ce que ces méthodes renvoient les mêmes valeurs. Seulement dans des cas uniques, comme des boîtes de dialogue où la fenêtre est effectivement décalée, vous verrez ces méthodes renvoyer des valeurs différentes.

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