今天热门
热点:

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)才有用,不加没反应

解决方案

因为你没加linearLayout.setLayoutParams(params);

下面的代码是setLayoutParams的源码:
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是一个对象,所以就不用调用重新加载了。

引用
@wei220000,@xingzhong128,那为什么在onCreate里不加setLayoutParams(Params)而直接修改也有用?

Activity里的UI展现是在onResume之后,onCreat的时候UI还没有展示,所以当你在onCreate设置了,onResume展示的时候读取的就是你设置的参数,但是在onclick里调用的时候UI已经展示,这个时候修改布局参数就需要重新更新旧的布局

如楼上和楼上的楼上所说,因为你定义的param是linearLayout.getLayoutParams();得到的,所以就等于是直接修改了linearLayout的布局属性,只是要等到执行了oncreate之后才会进行绘制。

www.zrccd.nettrue/topics/20180202/188806.htmlTechArticleLinearLayout.layoutParams为什么要在onTouch()加setLayoutParams(params)才有用,linearlayoutontouch publicclassMainActivityextendsActivityimplementsView.OnTouchListener{ LinearLayout.LayoutParamsparams; LinearLayoutlinearLayout;...

相关文章

    暂无相关文章

用户评论

大家都在看