当UI被定制时显示进度对话框

4

我已经知道如何在后台执行操作时使用进度对话框。但我的问题是,当我动态膨胀一个庞大的布局时,该如何显示进度对话框。

由于我无法在另一个线程中膨胀视图,因此我正在使用主UI线程。由于这个原因,我的进度对话框没有得到优先级,并且它不会显示出来。我的用户界面挂起了几秒钟,直到完全加载完成。我尝试了几种方法,但都没有成功。

        progress.show(context,"","inflating UI...");   
        setNewContent(R.layout.my_profile,R.id.my_profile_menu_button,R.id.my_profile_all_elements_layout);
                populateProfileList(); //Dynamic nested layouts being inflated.

我基本上是在寻找根据用户操作进行动态布局更改的方法。所以我没有其他方法,只能创建动态视图。有人能给我提供一个有用的想法吗?


你能否请发布setNewContent方法? - user936414
3个回答

2

我曾经遇到了一个类似的UI线程问题。我想在运行时向我的布局中添加很多视图,我想显示一个ProgressDialog来告知用户可能需要一些时间。我尝试使用AsyncTask,但唯一的方法是将我的ui方法实现到AsyncTask的onPostExecute方法中。但这会冻结ProgressDialog,因为ProgressDialog甚至在ui线程上工作。我找到了一个解决方案,也许不是最好的,但它可以工作。在开始ui操作之前,我先显示一个Toast。然后,我创建了一个带有handler的线程,并延迟了执行。完成ui操作后,我显示了一个新的Toast。延迟线程可以给Toast足够的时间显示:

    Toast.makeText(ActivityContext.this,
                  R.string.start_message,
          Toast.LENGTH_SHORT).show();

    final Handler uiHandler = new Handler();

    final Thread uiThread = new Thread(new Runnable() {

              @Override
           public void run() {

    uiHandler.postDelayed(new Runnable() {

              @Override
          public void run() {

              yourUIAction();

              Toast.makeText(
                  ActivityContext.this,
                  R.string.finish_message,
                  Toast.LENGTH_SHORT).show();                        

                            }
                          }, 100);
                  }
                });
     uiThread.start();

0
你需要使用一个处理程序才能与UI线程进行通信。
//in some thread
uiHandler.sendEmptyMessage(1);

...
Handler uiHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 1) {
                //do somestuff
            }
        }
    };

我知道我可以使用处理程序。我已经使用处理程序来更新用户界面。但是这一次,进度对话框卡住了。它不再旋转,使它看起来更糟糕。 - Andro Selva
如果你把进度对话框放在一个新的线程中并启动它,然后调用处理程序来填充你的布局,这样不应该就行了吗? - bwoogie
我尝试了一下,如果我用这种方式尝试,进度轮不会旋转。 - Andro Selva

0
使用异步任务对我来说是一个更好的想法,当你需要在后台执行某些操作时,同时进度对话框显示在屏幕上,然后当后台任务完成时,更新UI... 请参考以下链接。

http://labs.makemachine.net/2010/05/android-asynctask-example/

希望这个可以帮到你...:-)

3
请仔细阅读问题。我没有执行背景操作。我正在使用主UI线程来更新UI。我无法使用后台线程进行此操作。 - Andro Selva
好的,您可以使用相同的想法...在后台中填充UI并在前面显示旋转器,在填充函数执行结束时,删除旋转器。 - Usama Sarwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接