如何在布局上切换2个TextViews位置?

时间:2015-09-10 19:52:09

标签: android android-layout textview

我有OnClickListener收听Button A次点击。我在TextViews下面还有2 Button

我希望每次点击Button A时,TextViews都会在它们之间切换位置,如下所示:

点击之前:

TextView A
TextView B

点击后:

TextView B
TextView A

我该怎么办?是否有特殊功能可以做到这一点?还是某种伎俩?谢谢!

actvity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="start"
    tools:context="com.intap.tof.MainActivity">

    <TextView
        android:id="@+id/txtA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="20dp"
        android:visibility="visible"/>

    <TextView
        android:id="@+id/txtB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/txtA
        android:layout_marginTop="83dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:visibility="visible"
        android:textSize="20dp" />
</RelativeLayout>

MainActivity.java:

txtA = (TextView) findViewById(R.id.txtA);
txtB = (TextView) findViewById(R.id.txtB);

float mAX = txtA.getX();
float mAY = txtA.getY();
float mBX = txtB.getX();
float mBY= txtB.getY();

txtA.setX(mBX);
txtA.setY(mBY);

txtB.setX(mAX);
txtB.setY(mAY);

2 个答案:

答案 0 :(得分:2)

View.bringToFront方法可能很有用。

您的布局如下:

<LinearLayout>
    <TextView A>
    <TextView B>
</LinearLayout>

bringToFront上致电TextView A会将其提前(父LinearLayout中的最后一个位置)。

<LinearLayout>
    <TextView B>
    <TextView A>
</LinearLayout>

有关更详细的示例,下面是layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/text_holder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text_a" />

    <TextView
        android:id="@+id/text_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text_b" />

</LinearLayout>

OnClickListener(在Activity)电话中:

View textViewA = findViewById(R.id.text_a);
textViewA.bringToFront();

这应该有用。

此应用程序可以实现切换行为。例如:

ViewGroup textHolder = (ViewGroup) findViewById(R.id.text_holder);
textHolder.getChildAt(0).bringToFront();

ViewGroup.getChildAt(0)始终返回ViewGroup的第一个孩子。所以每当你打电话给bringToFront时,第一个孩子就会被带到前面。

答案 1 :(得分:1)

之前的所有答案都不起作用,因为您使用线性布局就足够的相对布局。 如果您必须转到 RelativeLayout ,请在点击监听器中执行以下操作

    TextView textA = (TextView) findViewById(R.id.txtA);
    TextView textB = (TextView) findViewById(R.id.txtB);

    RelativeLayout.LayoutParams textALayoutParams = (RelativeLayout.LayoutParams) textA.getLayoutParams();
    textALayoutParams.addRule(RelativeLayout.BELOW, R.id.txtB);
    textA.setLayoutParams(textALayoutParams);

    RelativeLayout.LayoutParams textBLayoutParams = (RelativeLayout.LayoutParams) textB.getLayoutParams();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        textBLayoutParams.removeRule(RelativeLayout.BELOW);
    } else {
        textBLayoutParams.addRule(RelativeLayout.BELOW,0);
    }
    textB.setLayoutParams(textBLayoutParams);

这会在 B 下放置 A 。你也可以做同样的逆转。