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

玷污

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

我通过单击按钮在相对布局中随机添加 ImageViews。到目前为止,这非常有效。但是为什么 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());

                }
            }

        }

    });
我是p。

当您致电时,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);
        }
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将元素添加到异步任务中的布局

来自分类Dev

将元素添加到列表中的特定位置

来自分类Dev

将元素添加到不同位置的列表中

来自分类Dev

将元素添加到列表中的特定位置

来自分类Dev

使用for循环将EditText添加到android中的布局

来自分类Dev

使用for循环将EditText添加到android中的布局

来自分类Dev

将图像添加到用户单击布局的位置

来自分类Dev

将图像添加到用户单击布局的位置

来自分类Dev

无法将自动布局约束添加到UITableViewCell中的元素

来自分类Dev

将新元素添加到映射后,出现“非Map-get获取映射”错误

来自分类Dev

将项目添加到有角度的列表中后如何保持滚动位置

来自分类Dev

Android:仅将布局资源添加到库中以进行测试

来自分类Dev

Android-将自定义视图添加到xml布局中的组件

来自分类Dev

以编程方式将规则添加到布局中已存在的视图-Android

来自分类Dev

将某个元素添加到字符串后,从列表中删除该字符

来自分类Dev

溢出后,箭头就会消失:将auto元素添加到其他div中

来自分类Dev

在渲染后将元素添加到Shiny中的绘图中

来自分类Dev

将某个元素添加到字符串后,从列表中删除该字符

来自分类Dev

获取添加到网格窗格的按钮数组中的位置[x] [y]的值

来自分类Dev

将滚动视图添加到android布局

来自分类Dev

Android-将布局视图添加到ListView

来自分类Dev

将滚动视图添加到android布局

来自分类Dev

将类添加到动态元素上的正文中,再次单击页面上的任意位置后将其删除

来自分类Dev

Android 布局元素位置

来自分类Dev

获取ID后将属性添加到数组中的行

来自分类Dev

单击 actionButton 后将 css 添加到元素

来自分类Dev

如何获取场景中的元素JavaFX /将对象动态添加到场景

来自分类Dev

将元素添加到JList时如何获取整数值以显示在JTextfield中

来自分类Dev

在将MapFragment添加到相同布局的怪异行为后,在布局内部扩大视图

Related 相关文章

  1. 1

    将元素添加到异步任务中的布局

  2. 2

    将元素添加到列表中的特定位置

  3. 3

    将元素添加到不同位置的列表中

  4. 4

    将元素添加到列表中的特定位置

  5. 5

    使用for循环将EditText添加到android中的布局

  6. 6

    使用for循环将EditText添加到android中的布局

  7. 7

    将图像添加到用户单击布局的位置

  8. 8

    将图像添加到用户单击布局的位置

  9. 9

    无法将自动布局约束添加到UITableViewCell中的元素

  10. 10

    将新元素添加到映射后,出现“非Map-get获取映射”错误

  11. 11

    将项目添加到有角度的列表中后如何保持滚动位置

  12. 12

    Android:仅将布局资源添加到库中以进行测试

  13. 13

    Android-将自定义视图添加到xml布局中的组件

  14. 14

    以编程方式将规则添加到布局中已存在的视图-Android

  15. 15

    将某个元素添加到字符串后,从列表中删除该字符

  16. 16

    溢出后,箭头就会消失:将auto元素添加到其他div中

  17. 17

    在渲染后将元素添加到Shiny中的绘图中

  18. 18

    将某个元素添加到字符串后,从列表中删除该字符

  19. 19

    获取添加到网格窗格的按钮数组中的位置[x] [y]的值

  20. 20

    将滚动视图添加到android布局

  21. 21

    Android-将布局视图添加到ListView

  22. 22

    将滚动视图添加到android布局

  23. 23

    将类添加到动态元素上的正文中,再次单击页面上的任意位置后将其删除

  24. 24

    Android 布局元素位置

  25. 25

    获取ID后将属性添加到数组中的行

  26. 26

    单击 actionButton 后将 css 添加到元素

  27. 27

    如何获取场景中的元素JavaFX /将对象动态添加到场景

  28. 28

    将元素添加到JList时如何获取整数值以显示在JTextfield中

  29. 29

    在将MapFragment添加到相同布局的怪异行为后,在布局内部扩大视图

热门标签

归档