在我的TableLayout上,一个TableRow有一个TextView,另一个有一个Spinner。当用户选中一个复选框时,我想交换这两个视图的位置。Spinner需要移动到TextView的位置,TextView需要移动到Spinner的位置。动画并不重要。我更喜欢它是即时发生的,但如果有必要的话,我可以让它成为一个超快的动画。我一直很惊讶,我有多少麻烦,我试图找到一个解决这个问题:/在类似的说明,Android开发参考真的可以使用一些简单的例子,如MSDN库。谢谢你,谢谢
bq3bfh9z1#
您可以尝试删除第一个TextView,然后使用addView添加回线性布局的末尾。
TextView tv = (TextView)layout.getChildAt(0); layout.removeView(tv); layout.addView(tv);
字符串这不是一个真正干净的代码,但我认为可能工作:)
1dkrff032#
下面是我最终用来交换视图的代码:
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是因为它是我想要交换的视图的父视图的类型。我假设这可以更新为目标视图具有的任何类型的父视图。
w8ntj3qf3#
这里有一个通用的Kotlin函数来交换两个视图的位置-我还没有测试它是否适用于Spinner和TextView的情况,但我目前不明白为什么不
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 }
字符串
62lalag44#
如果你想在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 } }
型
4条答案
按热度按时间bq3bfh9z1#
您可以尝试删除第一个TextView,然后使用addView添加回线性布局的末尾。
字符串
这不是一个真正干净的代码,但我认为可能工作:)
1dkrff032#
下面是我最终用来交换视图的代码:
字符串
在我的例子中,视图位于TableLayout的两个不同的行中。我使用TableRow是因为它是我想要交换的视图的父视图的类型。我假设这可以更新为目标视图具有的任何类型的父视图。
w8ntj3qf3#
这里有一个通用的Kotlin函数来交换两个视图的位置-我还没有测试它是否适用于
Spinner
和TextView
的情况,但我目前不明白为什么不字符串
62lalag44#
如果你想在Kotlin中交换视图,你可以使用下面的方法。当你点击按钮时,它会交换视图的位置,如果你再次点击,它会将视图设置为原始位置。
字符串
这里是如何调用它
型