2015-09-04 12 views
14

in ManActivity onCreate() Ho creato un'istanza di una nuova vista e l'ho aggiunta tramite layout.addView all'attività. Se provo getX() o getY() per quella vista ottengo sempre 0.0.Visualizza getX() e getY() restituiscono 0.0 dopo che sono stati aggiunti all'attività

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    RelativeLayout main = (RelativeLayout)findViewById(R.id.main); 

    RelativeLayout.LayoutParams squarePosition = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    GameToken square1 = new GameToken(this,GameToken.SQUARE, fieldHeight,fieldWidth); 
    squarePosition.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
    squarePosition.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
    main.addView(square1, squarePosition); 
    System.out.println(square1.getX()); //Prints '0.0' 
    System.out.println(square1.getY()); //Prints '0.0' 

risposta

21

ViewGroup s come RelativeLayout non impaginare i propri figli subito, e quindi la vostra View non sa ancora dove si trovano sullo schermo. È necessario attendere il RelativeLayout per completare un passaggio di layout prima che ciò possa accadere.

È possibile ascoltare gli eventi layout globale in questo modo:

view.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      // Layout has happened here. 

      // Don't forget to remove your listener when you are done with it. 
      view.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } 
    }); 
+0

Questo funziona perfettamente, grazie mille :) – cyden

1

Spostare le chiamate a GetX() e Gety() in onWindowFocusChanged() callback. Come dice la guida ufficiale, questo è il modo migliore per sapere se l'attività è visibile all'utente. Guardando il tuo codice, puoi mettere il tuo quadrato in variabili membro per poterlo usare con entrambi i callback.

Prova questo:

GameToken mSquare1 = new GameToken(this,GameToken.SQUARE, fieldHeight,fieldWidth); 

    ... 
    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 

      super.onWindowFocusChanged(hasFocus); 

      if(hasFocus) { 
      System.out.println(mSquare1.getX()); 
      System.out.println(mSquare1.getY()); 
      } 
    } 

La regola generale è che non è possibile recuperare informazioni sulle posizioni dal layout all'interno onCreate(), perché si sta solo creando e Android sono ancora elaborarli.

È possibile dare una possibilità anche al callbackResume(), ma per me non ha funzionato.

4

Un'altra opzione è quella di utilizzare post(Runnable action) metodo:

view.post(new Runnable() { 
    @Override 
    public void run() { 
     System.out.println(view.getX()); 
     System.out.println(view.getY()); 
    } 
}); 

questo modo il Runnable da eseguire dopo le altre attività in sospeso (ad esempio, che esce) sono finiti.

Problemi correlati