无法以编程方式更改布局

时间:2017-06-23 10:36:24

标签: android layout

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

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

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

答案 0 :(得分:0)

试试这个。

ImageView layout = (ImageView) findViewById(R.id.background);
layout.setImageResource(R.drawable.tablet2);

答案 1 :(得分:0)

imageView.setImageDrawable(getResources()getDrawable(R.drawable.ic_all_out_black_24dp));

您需要设置ImageDrawable而不是ImageResource

答案 2 :(得分:0)

哇,你的代码非常糟糕,你做错了(底部的简短回答,但你可能必须阅读以下内容):

  1. 您正在UI线程上运行while(true) {...}循环,这意味着您正在阻止UI线程,这可能就是为什么事情不适合您(例如更改布局)的原因。 (请注意,按钮onClick侦听器将由UI Thread调用。)
  2. 同样,您正在使用wait()调用,这也将阻止UI线程。请不要那样做!
  3. 使用synhronized(this)意味着您正在同步整个此对象,在您的情况下,这是活动。我认为没有理由这样做,只是在你的应用创建了同一活动的多个实例的情况下,我认为这不是你的情况。
  4. 我发现添加像这样的ImageView很可能是错误的:layout.setBackgroundResource(yourImageView),您需要使用layout.addView(yourImageView);向布局添加视图(您可能需要设置图像视图布局参数以将其显示为您要)。
  5. 简答:

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

    正确方法:

    似乎您需要在后台线程或AsyncTask上运行工作,线程可以等待某些事情发生(在您的情况下为myClient.mainresponse.contains("ok")),当发生这种情况时,您始终可以在UI上调用工作线程,像这样:

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