Android 无法以编程方式更改布局

Android 无法以编程方式更改布局,android,layout,Android,Layout,我正在制作一个有多个屏幕的应用程序 最初,我想在相对布局中使用图像视图并更改其背景源,但它不起作用 然后我创建了一个新的布局并设置了它的背景源。当我使用setContentView(R.layout.xx)时,它仍然不起作用 这只发生在我代码的某些部分。不是每个部分都有 无法找到解决方案 代码: buttonForm.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0

我正在制作一个有多个屏幕的应用程序

最初,我想在相对布局中使用图像视图并更改其背景源,但它不起作用

然后我创建了一个新的布局并设置了它的背景源。当我使用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();
    }
});

试试这个。

ImageView layout = (ImageView) findViewById(R.id.background);
layout.setImageResource(R.drawable.tablet2);
setImageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_all_out_black_24dp))


您需要设置ImageDrawable,而不是ImageResource

哇,您的代码真的很糟糕,您做的都是错的(底部的简短回答,但您可能必须阅读以下内容):

  • 您正在UI线程上运行
    while(true){…}
    循环,这意味着您正在阻止UI线程,这可能就是事情不适合您的原因(例如更改布局)。(注意,按钮onClick监听器将由UI线程调用)
  • 同样,您正在使用
    wait()
    call,这也会阻塞UI线程。请不要那样做
  • 使用synhronized(this)意味着您正在同步整个this对象,在您的情况下,this就是活动。我看不出有什么理由这么做,只是在你的应用程序创建同一活动的多个实例的情况下,我不认为这是你的情况
  • 我发现这样添加ImageView很可能是错误的:
    layout.setBackgroundResource(yourImageView)
    ,您需要使用
    layout.addView(yourImageView)将视图添加到布局中(您可能需要设置图像视图布局参数以根据需要显示它)
  • 简短回答:

    因此,动态调用
    setContentView(R.layout.tablet3)应该有效!
    我上面提到的所有其他不好的事情都会导致代码无法工作

    正确的方法:

    似乎您需要在后台线程或异步任务上运行工作,在那里,线程可以等待某些事情发生(
    myClient.mainresponse.contains(“ok”)
    ,在这种情况下,您可以随时调用UI线程上的工作,如下所示:

    runOnUiThread(new Runnable() {
        @Override
        public void run() { /* Do UI work, like changing layout */ }
    });
    

    没有成功:(.我无法理解它为什么不改变不,不工作。当我单击按钮时,它在内部执行所有操作,不知怎的,它跳过了这一行。layout.setImageDrawable(getResources().getDrawable(R.drawable.tablet2));可能是myClient.Main响应不包含“ok”好的..在外部初始化您的imageview可能..通过单击此事件,我可以在日志中看到“Received OK”。这意味着它进入此检查。这是GitHub链接:。它在MainActivity中