将子视图添加到具有相同边界的父布局

时间:2017-06-06 12:44:03

标签: android android-layout

RelativeLayout我有2个按钮:buttonbutton2。这3个本身位于根视图内,也是RelativeLayout

我要在这里尝试完成的是,点击button时,button2应从内部RelativeLayout中移除(其ID为otherLayout)并添加到根ViewrootView,但内部布局的边界相同。

这是我的XML和Java代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootView"
    tools:context="com.test.testproject.MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/otherLayout"
        >
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="53dp"
            android:layout_marginTop="94dp"
            android:text="One" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/button"
            android:layout_marginStart="76dp"
            android:layout_toEndOf="@+id/button"
            android:text="Two" />

    </RelativeLayout>

</RelativeLayout>

Java代码

public class MainActivity extends AppCompatActivity {

    Button button,button2;

    int mLeft,mRight,mTop,mBottom;
    RelativeLayout otherLayout;
    RelativeLayout rootView;
    ViewGroup childParent;
    int[] mBounds = new int[2];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button);
        button2 = (Button) findViewById(R.id.button2);
//        rootView = (RelativeLayout) findViewById(R.id.rootView);
        rootView = (RelativeLayout) findViewById(R.id.rootView);
        otherLayout = (RelativeLayout) findViewById(R.id.otherLayout);


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Rect r = new Rect();

                button2.getLocalVisibleRect(r);
//                button2.getDrawingRect(r);
//                ((ViewGroup)button2.getParent()).offsetDescendantRectToMyCoords(button2, r);

                mLeft = r.left;
                mRight = r.right;
                mBottom = r.bottom;
                mTop = r.top;

                childParent = (ViewGroup) button2.getParent();


                ((ViewGroup)button2.getParent()).removeView(button2);

                Handler mHandler = new Handler(Looper.getMainLooper());

                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {


                        button2.setTop(mTop);
                        button2.setLeft(mLeft);
                        button2.setBottom(mBottom);
                        button2.setRight(mRight);

/*
                        button2.setX(mBounds[1]);
                        button2.setY(mBounds[0]);*/


                        ((ViewGroup)rootView).addView(button2);
                    }
                },1000);

            }
        });

    }
}

我尝试了不同的方法但是会起作用。我使用了getLocalVisibleRect()getDrawingRect()和所有(您可以在评论代码中看到)。

那么我该如何实现呢?请记住,要求是内部布局中的View和添加到root后的Queue应该具有相同的边界和参数,并且屏幕上的位置也不能更改。

1 个答案:

答案 0 :(得分:1)

我认为您的问题可能与button2的布局参数有关。可能最简单的方法是捕获布局中button2的位置并设置新的布局参数。 mLeftmTop是左边距和上边距。

下面是简化的onCreate方法,但我很好奇为什么这会有用。

另请查看these caveatsView的文档指定了在布局系统之外不应调用setTop等的原因。 (见here。)

  

<强>机顶

     

void setTop(int top)

     

设置此视图相对于其父级的顶部位置。此方法应由布局系统调用,通常不应调用,因为布局可随时更改属性。

@Override
protected void onCreate(Bundle savedInstanceState) {
    Button button;

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = (Button) findViewById(R.id.button);
    button2 = (Button) findViewById(R.id.button2);
    rootView = (RelativeLayout) findViewById(R.id.rootView);
    otherLayout = (RelativeLayout) findViewById(R.id.otherLayout);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            RelativeLayout.LayoutParams params;
            int top = button2.getTop();
            int left = button2.getLeft();

            ((ViewGroup) button2.getParent()).removeView(button2);
            params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);
            params.setMargins(left, top, 0, 0);
            button2.setLayoutParams(params);
            rootView.addView(button2);
        }
    });
}