如何在网格布局中交换元素 Android

How to swap elements in a Grid Layout Android

<GridLayout
            android:id="@+id/tools_grid_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:columnCount="4"
            android:rowCount="3"
            android:alignmentMode="alignBounds"
            android:background="#AAAAAA">

            <ImageButton
                android:id="@+id/button_undo"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_columnWeight="1"
                android:src="@drawable/undo_icon"
                android:text="Undo" />
......
</GridLayout>

基本上,我的目标是能够在网格布局内交换按钮位置,同时保持其他按钮的大小。

我尝试在每个元素上使用 getX() 和 getY() 来交换 GridLayout 的元素。但后来我意识到这会影响我在网格布局中的其他按钮的大小,因为每个按钮的大小取决于它的权重。 有没有其他方法可以直接交换 gridLayout 中的元素?

任何帮助都会很有帮助。谢谢

我已经找到解决方法,但如果您有更好的解决方案,请告诉我。 我保存了对 ArrayList 中所有按钮的引用 然后用

删除GridLayout里面的所有元素

toolGridLayout.removeAllViews();

然后我根据需要使用 ArrayList 交换了按钮。 最后我使用 toolGridLayout.addView(element) 函数在我的数组列表中添加按钮。

你可以试试这个。

private void swap(ViewGroup parent, int resourceId1, int resourceId2)
{
    final int children = parent.getChildCount();
    if(children == 0) return;
        
    View view1=null, view2=null;
    int id, count=0, index1=0, index2=0;
    for(int i=0; i<children; ++i) {
        final View view = parent.getChildAt(i);
        id = view.getId();
        if(id == resourceId1) {
            view1 = view;
            index1 = i;
            ++count;
        } else if(id == resourceId2) {
            view2 = view;
            index2 = i;
            ++count;
        }
        if(count == 2) break;
    }
    if(count == 2) {
        if(index1 < index2) {
            parent.removeViewAt(index2);
            parent.removeViewAt(index1);
            parent.addView(view2, index1);
            parent.addView(view1, index2);
        } else {
            parent.removeViewAt(index1);
            parent.removeViewAt(index2);
            parent.addView(view1, index2);
            parent.addView(view2, index1);
        }
    }
}

使用方法:

GridLayout gl = findViewById(R.id.tools_grid_layout);
swap(gl, R.id.btn_undo, R.id.btn_redo);
// Or this (doesn't matter which one first).
// swap(gl, R.id.btn_redo, R.id.btn_undo);