我正在制作一个有多个屏幕的应用程序 .
最初,我想在相对布局中使用图像视图并更改其背景源,但它不起作用 .
然后我创建了一个新布局并设置了它的背景源 . 当我使用setContentView(R.layout.xx)时仍然没有用 .
这只发生在我的代码的某些部分 . 不在每个部分 .
无法找到解决方案 .
代码:
buttonForm.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Log.d("Socket","Entered User Details " );
Log.d("Socket","Name : " + editName.getText());
Log.d("Socket","Number : " + editNumber.getText());
Log.d("Socket","Email : " + editEmail.getText());
myClient.msg = "one";
msg = "one";
// setContentView(R.layout.basic);
while(true) {
Log.d("Socket","Waiting for ok " );
try {
synchronized(this){
wait(1000);
}
}
catch(InterruptedException ex){
}
if ((myClient.mainresponse.contains("ok"))) {
myClient.msg = "ready";
Log.d("Socket","Received OK");
// setContentView(R.layout.tablet3); -> here tablet 3 is a xml layout
ImageView layout = (ImageView) findViewById(R.id.background);
layout.setBackgroundResource(R.drawable.tablet2); // -> here tablet 2 is a image in drawable
// getWindow().getDecorView().findViewById(android.R.id.).invalidate();
break;
}
}
countryPicker();
}
});
3 回答
Try this.
imageView.setImageDrawable(getResources()getDrawable(R.drawable.ic_all_out_black_24dp));
你需要设置ImageDrawable而不是ImageResource
哇,你的代码非常糟糕,你做错了( Short answer at the bottom ,但你可能必须阅读以下内容):
您正在UI线程上运行
while(true) {...}
循环,这意味着您正在阻止UI线程,这可能就是为什么事情不适合您(例如更改布局)的原因 . (请注意,按钮onClick侦听器将由UI Thread调用) .再次,您正在使用
wait()
调用,这也将阻止UI线程 . 请不要这样做!使用synhronized(this)意味着您正在同步整个此对象,在您的情况下,这是活动 . 我认为没有理由这样做,只是在你的应用创建了同一活动的多个实例时,我认为这不是你的情况 .
我看到像这样添加ImageView很可能是错误的:
layout.setBackgroundResource(yourImageView)
,你需要使用layout.addView(yourImageView);
为布局添加视图(你可能需要设置图像视图布局参数以根据需要显示它) .Short answer:
所以,动态调用
setContentView(R.layout.tablet3);
应该可行!这是我上面提到的所有其他不好的事情导致你的代码无法工作!Right approach:
看来你需要在后台线程或AsyncTask上运行工作,线程可以等待某些事情发生(在你的情况下是
myClient.mainresponse.contains("ok")
),当发生这种情况时,你总是可以在UI线程上调用工作,如下所示: