我有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);
答案 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 。你也可以做同样的逆转。