我遇到一个问题,我的进度对话框不显示或不执行任何操作。我正在制作一个可以转换值的货币转换器。这是我的代码:

if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") && edittextdollars.length() > 0 && edittexteuros.length()==0) {
            while (edittextdollars.equals("")) {
                final ProgressDialog myPd_ring=ProgressDialog.show(getActivity(), "", "Loading...", true);
                myPd_ring.setCancelable(true);
                new Thread(new Runnable() {
                      @Override
                      public void run() {
                            try
                            {
                                convertvalues("USD", "EUR");
                            }catch(Exception e){

                            }
                            myPd_ring.dismiss();
                      }
                }).start();
            }
        }


没有进度对话框,如所示:

    if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") && edittextdollars.length() > 0 && edittexteuros.length()==0) {

                convertvalues("USD", "EUR");

}


它有效,但是在返回值之前,按下了“计算”按钮几秒钟。我想要一个progressdialog显示该值正在加载。我已经搜索过Google,但没有任何效果。任何有关此问题的帮助表示赞赏。

附言我希望您发布代码,而不是只说没有任何代码的解决方案。另外,请发布任何您认为对我有帮助的网站(例如教程)。再次感谢。

编辑:

当我添加以下代码时:

if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") && edittextdollars.length() > 0 && edittexteuros.length()==0) {
            myPd_ring = ProgressDialog.show(getActivity(), "", "Loading...", true, true);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        convertvalues("USD", "EUR");
                    } catch(Exception e) {

                    }

                }
            }).start();
        }

@Override
public void afterTextChanged(Editable arg0) {
    myPd_ring.dismiss();
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {
    // TODO Auto-generated method stub

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    // TODO Auto-generated method stub

}


我已经实现了TextWatcher,但是它不起作用。 progressdialog会一直保留在那里,并且值不会改变。任何帮助将不胜感激。

最佳答案

您所做的不正确。

while (edittextdollars.equals("")) { // this while loop is not the way to wait for calculation finish...inside this while loop you are spwaning a thread which is not correct
    final ProgressDialog myPd_ring=ProgressDialog.show(getActivity(), "", "Loading...", true);  //here you are showing the dialog
    myPd_ring.setCancelable(true);
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                convertvalues("USD", "EUR");
            } catch(Exception e) {

            }
            myPd_ring.dismiss(); // the run method can be called within few milliseconds of starting the thread..so in essence immediately you are removing your dialog
        }
    }).start(); // just after showing the dialog you are starting the thread
}


我建议进行以下更改(我假设您的方法convertvalues是更改edittexteuros文本的方法):

1.在活动课程中声明myPd_ring

ProgressDialog myPd_ring = null;


2.让您的活动实现TextWatcher(添加未实现的方法)

public class YourActivity extends Activity implements TextWatcher


3.用您的EditText edittexteuros添加TextWatcher。

edittexteuros = (EditText) findViewById(R.id.youreditTextId);
edittexteuros.addTextChangedListener(YourActivity.this);


4.计算部分并显示对话框

if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") && edittextdollars.length() > 0 && edittexteuros.length() == 0) {
    myPd_ring = ProgressDialog.show(getActivity(), "", "Loading...", true, true);
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                convertvalues("USD", "EUR");
            } catch(Exception e) {

            }

        }
    }).start();
}


5.从afterTextChanged解散Dialog

@Override
public void afterTextChanged(Editable arg0) {
    // TODO Auto-generated method stub
    myPd_ring.dismiss();
}


编辑:

您确定current始终是有效值吗?作为预防措施,您需要在异常情况下显示一些错误文本(您始终需要设置一些文本,否则对话框将永远不会关闭)。请调试并检查您是否始终从网络获得正确的响应。我提供给您的代码可以在我的测试设置中完美运行,因此您的问题可能现在出在其他地方。您将需要调试并找出答案。

YahooCurrencyConverter ycc = new YahooCurrencyConverter();
try {
    current = ycc.convert(convertfrom, convertto);
    edittexteuros.setText(df.format(val*current));
    return "passed";
} catch (Exception e) {
    edittexteuros.setText("some error message");
    return "passed";
}

09-26 22:50
查看更多