Android addview自定义控件不显示问题

为什么我在onCreat中addview一个自定义控件能够正常显示,但是在onWindowsFoucsChanged里面addview总是显示不出来

11个回答

你可以在oncreate 中 添加 然后再 onWindowFocusChanged 中设置 宽高

qq_33230445
静水流深—j 头都大了,感觉这样不行啊
4 年多之前 回复
qq_33230445
静水流深—j 我这是画得一个圆,是有画得过程的那种,实例化的后面那3个参数分别是圆心X坐标,圆心Y坐标,半径,半径也不是固定的,一直在变化,我只是随便写了一个,必须得先实例化,才能添加啊,宽高什么的我这还能怎么设?
4 年多之前 回复

把进去的view,addview之前,先用view.measure(0,0)测量一下,再加进去

qq_33230445
静水流深—j 我试了,没效果啊
4 年多之前 回复

把进去的view,addview之前,先用view.merits(0,0)测量一下,再加进去

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    Circleview av = new Circleview(this, 360, 468, 150);
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    cl = (LinearLayout) findViewById(R.id.cl);
    cl.addView(av);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    cl = (LinearLayout) findViewById(R.id.cl);
    w = cl.getWidth() / 2;
    h = cl.getTop() + cl.getHeight() / 2;
    av = new Circleview(this, w, h, 150);
    cl.addView(av);
    super.onWindowFocusChanged(hasFocus);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    Circleview av = new Circleview(this, 360, 468, 150);
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    cl = (LinearLayout) findViewById(R.id.cl);
    cl.addView(av);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
cl = (LinearLayout) findViewById(R.id.cl);
w = cl.getWidth() / 2;
h = cl.getTop() + cl.getHeight() / 2;
av = new Circleview(this, w, h, 150);
cl.addView(av);
super.onWindowFocusChanged(hasFocus);
}

代码看起来没有问题,你知道什么时候触发这个方法吗?

qq_33230445
静水流深—j 回复CrawlWu: onCreate先执行,我是方便你看才写成这样的,用onCreate的时候就没用重写onWindowFocusChanged,但是你也看出来了,我是画得个圆,要根据父组件的宽高来确定圆心坐标,所以要用onWindowFocusChanged测才行
4 年多之前 回复
qq_27564553
Crawl.W 回复qq_33230445: 你说的得到焦点并不是你点了之后知道吗,是自动获得的,所以让你打个断点
4 年多之前 回复
qq_27564553
Crawl.W 修改你半径试试,或者在oncreate中先不画
4 年多之前 回复
qq_27564553
Crawl.W 回复qq_33230445: 我看到是你onCreate中定义了Circleview av这个局域变量,不知道你这连个函数是不是同时实现的。猜想是不是你最终的结果就是onWindowFocusChanged之后的结果,在这里打个断点
4 年多之前 回复
qq_33230445
静水流深—j 回复CrawlWu: 还没画出来啊,都还没有你测什么。。
4 年多之前 回复
qq_27564553
Crawl.W 回复qq_33230445: 那你知道为什么onCreate中不好获得组件的宽和高呢?
4 年多之前 回复
qq_33230445
静水流深—j onCreare里面不好获得组件的宽高,这个方法就是在组件绘制完成之后,当前activity得到焦点的时候调用的
4 年多之前 回复

因为从onWindowFocusChanged被执行起,用户可以与应用进行交互 ,是真正visible的时间点,已经加载完毕

qq_33230445
静水流深—j 回复sl_18500: 可是有什么方法可以再之前得到组件的宽高呢,我在网上查了多种方法,虽然代码写下onCreate里的,但都是在onResume方法之后才得到的,跟onWindowFocusChanged查不多
4 年多之前 回复
sl_18500
小小Q_Forler 是的
4 年多之前 回复
qq_33230445
静水流深—j 就是说必须在onWindowFocusChanged执行之前addview才行?
4 年多之前 回复

你添加进去了,但是没有告诉显示多大,再设置一个布局参数进去吧。

qq_33230445
静水流深—j 不是吧,刚开始没有,但是熄屏再点亮屏幕就正常了
4 年多之前 回复

设置一下params吧

qq_33230445
静水流深—j 不是吧,刚开始没有,但是熄屏再点亮屏幕就正常了
4 年多之前 回复

public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
cl = (LinearLayout) findViewById(R.id.cl);
w = cl.getWidth() / 2;
h = cl.getTop() + cl.getHeight() / 2;
av = new Circleview(this, w, h, 150);
cl.addView(av);
}
}

试试

qq_33230445
静水流深—j 回复Smile_KO: 确实不该放在里面,但是也没办法解决啊
4 年多之前 回复
lxk_1993
103style cl.addView(av); 不应该放在这里面
4 年多之前 回复
共11条数据 1 尾页
立即提问
相关内容推荐