Android:交换2个视图的位置

问题描述 投票:0回答:4

在我的 TableLayout 上,一个 TableRow 有一个 TextView,另一个 TableRow 有一个 Spinner。当用户选中复选框时,我想交换这两个视图的位置。 Spinner需要移动到TextView的位置,TextView需要移动到Spinner的位置。

动画并不重要。我的偏好是它立即发生,但如果有必要,我可以将其制作为超快的动画。

我很惊讶我在尝试找到此问题的解决方案时遇到了多少麻烦:/类似地,Android 开发参考确实可以使用 MSDN 库中的一些简单示例。

谢谢!

android android-layout android-widget
4个回答
4
投票

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

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

这不是一个真正干净的代码,但我的东西可能有用:)


3
投票

这是我最终用来交换视图的代码:

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


0
投票

这是一个通用的 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
}

0
投票

在 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
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.