首页 文章

无法以编程方式更改布局

提问于
浏览
0

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

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

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

    Try this.

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

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

    你需要设置ImageDrawable而不是ImageResource

  • 0

    哇,你的代码非常糟糕,你做错了( 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线程上调用工作,如下所示:

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

相关问题