我的启动活动包括带两个按钮的线性布局。两个按钮都有听众:第一个按钮(b)在点击时自动移动:向左移动30px,在下一次单击时返回30px。 第二个(b2)在点击时更改其文本。这是代码:
public class TestActivity extends Activity {
public final String TAG="TestActivity";
boolean toTop=true;
boolean setInitialText=false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b=(Button)findViewById(R.id.button);
Button b2=(Button)findViewById(R.id.button2);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int modifier;
if(toTop) modifier=-30;
else modifier=30;
v.layout(v.getLeft()+modifier,v.getTop(),v.getRight()+modifier,v.getBottom());
toTop=!toTop;
}
});
b2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String currentText;
if(setInitialText)currentText="Press to change text";
else currentText="Press to change back";
((Button)v).setText(currentText);
setInitialText=!setInitialText;
}
});
}
}
XML layout-file:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Press to begin animation" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Press to change text" />
我的问题:当b向左移动并按b2时,b移动到其初始位置。为什么?我不希望它向后移动,也没有在任何地方指定它。
看起来View.layout失去了它的效果。为什么会这样?我在其他情况下测试了它,似乎任何UI更新都会使所有被调用的View.layout方法失去效果。
在我的主项目中有一个ListView,其中填充了来自背景的图像 - 当出现新图像时,所有视图都会移动松散效果。此外,如果我添加EditText并尝试输入内容(作为用户),视图也会移动它们的效果。任何人都可以向我解释发生了什么以及为什么观点会回归?
答案 0 :(得分:0)
在为button2
设置新文本后,看起来父布局会重新定位它的兄弟姐妹,因为正如xml中所述,button2
按宽度和高度包装它的内容。
当您更改按钮的内容时,它会请求它的父布局为其获取新位置。在这种情况下,父布局将重新计算其所有兄弟姐妹的位置值。这就是为什么button1
也会回到之前的位置。
请记住,您还将父布局的重力值设置为center
,这意味着当布局定位它的兄弟时,它会将它们放置在它的中心。
尝试尝试一些像FrameLayout
这样的更好的布局类,它具有定位它的兄弟和RelativeLayout
的绝对方式,并且还可以尝试摆脱布局的重力。
答案 1 :(得分:0)
Here表示可以使用view.setLayoutParams()
代替view.layout()
来解决此问题