LinearLayout.layoutParams为什么要在onTouch()加setLayoutParams(params)才有用,linearlayoutontouch
public class MainActivity extends Activity implements View.OnTouchListener{LinearLayout.LayoutParams params;
LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout=(LinearLayout)findViewById(R.id.linearLayout);
params=(LinearLayout.LayoutParams)linearLayout.getLayoutParams();
params.width=100;
params.height=50;
params.leftMargin=50;
linearLayout.setOnTouchListener(this);
}
public boolean onTouch(View view,MotionEvent event)
{
params.leftMargin=50;
// linearLayout.setLayoutParams(params);
return false;
}
}
我要设置leftMargin的值,接触一下后改为另一个值
在onCreate()函数里不加linearLayout.setLayoutParams(params);也可以设置,
为什么在onTouch里要加linearLayout.setLayoutParams(params)才有用,不加没反应
解决方案
public void setLayoutParams(ViewGroup.LayoutParams params) {
if (params == null) {
throw new NullPointerException("Layout parameters cannot be null");
}
mLayoutParams = params;
resolveLayoutParams();
if (mParent instanceof ViewGroup) {
((ViewGroup) mParent).onSetLayoutParams(this, params);
}
requestLayout();
}
可以看到有对父控件的布局参数修改,同时最后那句requestLayout意思就是修改了布局参数之后重新布局,所以修改布局参数之后还有很多事情要做,直接修改参数并不会触发这些代码,所以就不会起效 这个具体的在oncreate 中为什么不用那样写 应该是需要看看framework层了,我记得有本书上说我们只用到onstart方法才可以确保页面布局加载完毕,应该就是说oncreate里一直都在加载页面,而你的params的与当前的linearlayout是一个对象,所以就不用调用重新加载了。
Activity里的UI展现是在onResume之后,onCreat的时候UI还没有展示,所以当你在onCreate设置了,onResume展示的时候读取的就是你设置的参数,但是在onclick里调用的时候UI已经展示,这个时候修改布局参数就需要重新更新旧的布局 如楼上和楼上的楼上所说,因为你定义的param是linearLayout.getLayoutParams();得到的,所以就等于是直接修改了linearLayout的布局属性,只是要等到执行了oncreate之后才会进行绘制。
用户评论