Android:交换2个视图的位置

du7egjpx  于 2023-11-15  发布在  Android
关注(0)|答案(4)|浏览(122)

在我的TableLayout上,一个TableRow有一个TextView,另一个有一个Spinner。当用户选中一个复选框时,我想交换这两个视图的位置。Spinner需要移动到TextView的位置,TextView需要移动到Spinner的位置。
动画并不重要。我更喜欢它是即时发生的,但如果有必要的话,我可以让它成为一个超快的动画。
我一直很惊讶,我有多少麻烦,我试图找到一个解决这个问题:/在类似的说明,Android开发参考真的可以使用一些简单的例子,如MSDN库。
谢谢你,谢谢

bq3bfh9z

bq3bfh9z1#

您可以尝试删除第一个TextView,然后使用addView添加回线性布局的末尾。

TextView tv = (TextView)layout.getChildAt(0);
layout.removeView(tv);
layout.addView(tv);

字符串
这不是一个真正干净的代码,但我认为可能工作:)

1dkrff03

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是因为它是我想要交换的视图的父视图的类型。我假设这可以更新为目标视图具有的任何类型的父视图。

w8ntj3qf

w8ntj3qf3#

这里有一个通用的Kotlin函数来交换两个视图的位置-我还没有测试它是否适用于SpinnerTextView的情况,但我目前不明白为什么不

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
}

字符串

62lalag4

62lalag44#

  • 在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
        }
    }

相关问题