2017-07-15 4 views
0

J'essaie d'obtenir les positions d'une image après l'avoir ajoutée à une mise en page relative.Obtenir les positions des éléments après l'ajout à la mise en page dans Android

J'ajoute des images au hasard dans la disposition relative en cliquant sur un bouton. Jusqu'à présent, cela fonctionne très bien. Mais pourquoi getLeft, getRight, getTop, getBottom renvoient 0? La chose est, que les valeurs sont toutes disponibles sur le prochain bouton. Donc, quand ImageView 1 a tout 0 sur la création, il a l'information si je clique à nouveau sur le bouton.

donc à préciser:

ButtonClick-1 -> ImageView-1 ajouté (sorties 0 sur getLeft, Haut, Droite, Bas)

ButtonClick-2 -> ImageView-2 ajouté (ImageView-1 sorties coordonnées, mais ImageView-2 sorties 0)

Je suis sûr que cela a à voir avec le dessin de l'ImageView. Sûrement il n'est pas prêt dessiné sur la vue quand je itère sur les enfants et demande les positions réelles.

Voici mon code à ce jour:

final ConstraintLayout cl = (ConstraintLayout) findViewById(R.id.constraintLayout); 
    final ScrollView sc=(ScrollView) findViewById(R.id.scrollView); 
    final Button btnButton = (Button) findViewById(R.id.buttontest); 
    final LinearLayout ll = (LinearLayout) findViewById(R.id.linearLayout); 
    final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rLayout); 



    btnButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      ImageView im= new ImageView(UserAreaActivity.this); 
      im.setImageResource(R.mipmap.ic_launcher); 
      im.setScaleType(ImageView.ScaleType.FIT_XY); 

      RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150); 

      Random r = new Random(); 
      Random r2 = new Random(); 

      int x = r.nextInt(rl.getWidth()); 
      int y = r2.nextInt(rl.getHeight()); 


      if(x+(layoutParams.width) >= rl.getWidth()){ 
       x=x-layoutParams.width; 
      } 

      if(y+(layoutParams.height) >= rl.getHeight()){ 
       y=y-layoutParams.height; 
      } 

      layoutParams.leftMargin=x; 
      layoutParams.topMargin=y; 

      im.setLayoutParams(layoutParams); 



      TextView tv = new TextView(UserAreaActivity.this); 
      tv.setText("my text"); 


      rl.addView(im); 
      ll.addView(tv); 

      System.out.println("ID "+im.getId()); 
      System.out.println("Left "+im.getLeft()); 
      System.out.println("Right "+im.getRight()); 
      System.out.println("Top "+im.getTop()); 
      System.out.println("Bottom "+im.getBottom()); 


      for (int i = 0; i < rl.getChildCount(); i++) { 

       View subView = rl.getChildAt(i); 

       if (subView instanceof ImageView) { 
        ImageView imageView = (ImageView) subView; 

        System.out.println("ID "+i); 
        System.out.println("Left "+imageView.getLeft()); 
        System.out.println("Right "+imageView.getRight()); 
        System.out.println("Top "+imageView.getTop()); 
        System.out.println("Bottom "+imageView.getBottom()); 

       } 
      } 

     } 

    }); 

Répondre

1

Lorsque vous appelez rl.addView(im); vous démarrons un processus qui finira par impliquer un « laissez-passer de la mise en page » pour votre RelativeLayout et votre ImageView. Ce n'est qu'après que cette passe de mise en page soit terminée que vous pourrez obtenir des coordonnées valides pour votre ImageView.

Malheureusement, il n'y a pas de doublure pour «donnez-moi les coordonnées après la mise en page». Toutes les meilleures options sont asynchrones (c'est-à-dire que vous enregistrez du code à exécuter une fois que le ImageView a été configuré). Je recommande ViewTreeObserver.OnGlobalLayoutListener.

Quelque chose comme ceci:

im.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      System.out.println("ID "+im.getId()); 
      System.out.println("Left "+im.getLeft()); 
      System.out.println("Right "+im.getRight()); 
      System.out.println("Top "+im.getTop()); 
      System.out.println("Bottom "+im.getBottom()); 

      im.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } 
    }); 
+0

Merci beaucoup! Cela a résolu mon problème. Btw. J'ai dû faire attention à l'API sur laquelle je travaille car removeOnGlobalLayoutListener n'est pas couvert dans API Lvl 15 – Sully