首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android中添加布局后获取元素位置

在Android中添加布局后获取元素位置
EN

Stack Overflow用户
提问于 2017-07-15 15:48:38
回答 1查看 105关注 0票数 0

在将ImageView添加到相对布局后,我正在尝试获取它的位置。

我通过单击一个按钮在相对布局中随机添加ImageViews。到目前为止,这是非常好的。但是为什么getLeft,getRight,getTop,getBottom会返回0呢?问题是,在下一个按钮上所有的值都是可用的。因此,当ImageView 1在创建过程中拥有所有的0时,如果我再次单击按钮,它就会得到信息。

因此,为了表明这一点:

添加了Buttonclick-1 -> ImageView-1 (在getLeft、顶部、右侧、底部输出0)

Buttonclick-2 -> ImageView-2添加(ImageView-1输出坐标,但ImageView-2输出0)

我相信这与ImageView的绘制有关。当然,当我反复询问孩子们并询问他们的实际立场时,他们还没有做好准备。

到目前为止,我的代码如下:

代码语言:javascript
复制
    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());

                }
            }

        }

    });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-15 16:14:12

当您调用rl.addView(im);时,您将开始一个最终涉及到RelativeLayoutImageView的“布局传递”的进程。只有在这个布局传递完成之后,您才能获得ImageView的有效坐标。

不幸的是,没有“布局传递后给我坐标”的单线。所有最好的选项都是异步的(即,一旦部署了ImageView,就注册一些要运行的代码)。我推荐ViewTreeObserver.OnGlobalLayoutListener

就像这样:

代码语言:javascript
复制
    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);
        }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45120033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档