【问题标题】:Get Element Positions after adding to layout in Android在Android中添加到布局后获取元素位置
【发布时间】:2017-07-16 00:14:12
【问题描述】:

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

我通过单击按钮在相关布局中随机添加 ImageView。到目前为止,这非常有效。但为什么 getLeft、getRight、getTop、getBottom 返回 0?问题是,这些值在下一次单击按钮时都可用。因此,当 ImageView 1 在创建时所有内容都为 0 时,如果我再次单击该按钮,它就会显示信息。

所以说清楚:

Buttonclick-1 -> 添加了 ImageView-1(在 getLeft、Top、Right、Bottom 上输出 0)

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

我确定这与 ImageView 的绘制有关。当我遍历孩子并询问实际位置时,它肯定还没有准备好绘制在视图上。

到目前为止,这是我的代码:

    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());

                }
            }

        }

    });

【问题讨论】:

    标签: android android-layout imageview position


    【解决方案1】:

    当您调用rl.addView(im); 时,您将启动一个过程,该过程最终将涉及您的RelativeLayout 和ImageView 的“布局通行证”。只有在此布局传递完成后,您才能获得 ImageView 的有效坐标。

    不幸的是,没有“在布局通过后给我坐标”这样的语句。所有最好的选项都是异步的(即,您注册一些代码以在布置 ImageView 后运行)。我推荐ViewTreeObserver.OnGlobalLayoutListener。

    类似这样的:

        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);
            }
        });
    

    【讨论】:

    • 非常感谢!这解决了我的问题。顺便提一句。我必须注意我正在处理哪个 API,因为 removeOnGlobalLayoutListener 未包含在 API Lvl 15 中
    猜你喜欢
    • 2016-03-08
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多