【问题标题】:Unable to change layout programmatically无法以编程方式更改布局
【发布时间】:2017-06-23 20:25:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: android layout


    【解决方案1】:

    试试这个。

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

    【讨论】:

    • 没有成功:(。我不明白为什么它没有改变
    【解决方案2】:

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

    你需要设置 ImageDrawable 而不是 ImageResource

    【讨论】:

    • 不,不工作。当我单击按钮时,它会在内部完成所有操作,不知何故只是跳过了这一行。 layout.setImageDrawable(getResources().getDrawable(R.drawable.tablet2));
    • 可能是myClient.mainresponse不包含“ok”
    • 好吧.. 初始化你的 imageview 到外面也许.. 在这个点击事件之外
    • 好吧,我可以在日志中看到“已接收成功”。这意味着它进入了这个检查。这是 GitHub 链接:github.com/navaljoshi/QatarFly。它在 MainActivity
    【解决方案3】:

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

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

    简答:

    所以,动态调用setContentView(R.layout.tablet3); 应该可以了! 是我上面提到的所有其他坏事导致您的代码无法工作!

    正确做法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2018-10-22
      相关资源
      最近更新 更多