如何在网格布局中交换元素 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);
<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);