在我的 TableLayout 上,一个 TableRow 有一个 TextView,另一个 TableRow 有一个 Spinner。当用户选中复选框时,我想交换这两个视图的位置。 Spinner需要移动到TextView的位置,TextView需要移动到Spinner的位置。
动画并不重要。我的偏好是它立即发生,但如果有必要,我可以将其制作为超快的动画。
我很惊讶我在尝试找到此问题的解决方案时遇到了多少麻烦:/类似地,Android 开发参考确实可以使用 MSDN 库中的一些简单示例。
谢谢!
您可以尝试删除第一个 TextView,然后使用 addView 添加回线性布局的末尾。
TextView tv = (TextView)layout.getChildAt(0);
layout.removeView(tv);
layout.addView(tv);
这不是一个真正干净的代码,但我的东西可能有用:)
这是我最终用来交换视图的代码:
import android.widget.TableRow;
TableRow trI = (TableRow) findViewById(R.id.tr_input_row);
TableRow trO = (TableRow) findViewById(R.id.tr_output_row);
View v1 = (View) findViewById(R.id.View1);
View v2 = (View) findViewById(R.id.View2);
if (isInput()) {
trO.removeView(v1);
trI.removeView(v2);
trO.addView(v2);
trI.addView(v1);
} else {
trO.removeView(v2);
trI.removeView(v1);
trO.addView(v1);
trI.addView(v2);
}
在我的例子中,视图位于 TableLayout 的两个不同行中。我使用 TableRow 因为它是我想要交换的视图的父级的类型。我认为这可以更新为目标视图具有的任何类型的父级。
这是一个通用的 Kotlin 函数,用于交换 2 个视图的位置 - 我还没有测试它是否适用于您的
Spinner
和 TextView
的情况,但我目前不明白为什么不
fun swapViews(view1: View, view2: View){
val view1Parent = view1.parent as ViewGroup
val view1Params = view1.layoutParams
val view2Parent = view2.parent as ViewGroup
val view2Params = view2.layoutParams
view1Parent.removeView(view1)
view2Parent.removeView(view2)
view2Parent.addView(view1)
view1Parent.addView(view2)
view1.layoutParams = view2Params
view2.layoutParams = view1Params
}
在 Kotlin 中使用动画交换两个视图。
如果你想交换到 Kotlin 中的视图,你可以使用下面的方法。当您单击该按钮时,它将交换视图的位置,如果您再次单击该按钮,它将将视图设置为原始位置。
private fun swapViewPositions(viewFrom: View, viewTo: View) {
val translationX1: Float
val translationY1: Float
val translationX2: Float
val translationY2: Float
if (isSwapped) {
translationX1 = 0f
translationY1 = 0f
translationX2 = 0f
translationY2 = 0f
} else {
translationX1 = viewTo.x - viewFrom.x
translationY1 = viewTo.y - viewFrom.y
translationX2 = viewFrom.x - viewTo.x
translationY2 = viewFrom.y - viewTo.y
}
val translationAnimator1 = ObjectAnimator.ofFloat(viewFrom, "translationX", translationX1)
val translationAnimator2 = ObjectAnimator.ofFloat(viewFrom, "translationY", translationY1)
val translationAnimator3 = ObjectAnimator.ofFloat(viewTo, "translationX", translationX2)
val translationAnimator4 = ObjectAnimator.ofFloat(viewTo, "translationY", translationY2)
val animatorSet = AnimatorSet()
animatorSet.playTogether(
translationAnimator1,
translationAnimator2,
translationAnimator3,
translationAnimator4
)
animatorSet.duration = 500 //you can change duration
animatorSet.start()
}
这是如何调用它
binding.apply {
cvConversionCurrency.setOnClickListener {
swapViewPositions(clFrom, clTo)
isSwapped = !isSwapped
}
}