MonoDroid ProgressDialog

jme*_*ase 2 android xamarin.android

我想要做的就是确保用户知道web服务正在处理,这样他们就不会在尝试工作时反复混搭按钮.

        EditText partnumber = (EditText)FindViewById(Resource.Id.itemNumber);
        partnumber.FocusChange += (object sender, View.FocusChangeEventArgs e) =>
        {
            if (!e.HasFocus)
            {
                var pd = ProgressDialog.Show(this, "Processing", "Please Wait...", false);
                var res = new InventoryApp();
                res.partValidateCompleted += delegate { pd.Hide(); };
                var isValid = res.partValidate(partnumber.Text);
                if (isValid == "Not Found")
                {
                    partnumber.Text = "";
                    partnumber.RequestFocus();
                    partqty.ClearFocus();
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.SetTitle("Invalid Part");
                    builder.SetMessage("Part number does not exist in database. Please ensure you are entering the correct part number and try again");
                    builder.SetPositiveButton("OK", delegate { });
                    var dialog = builder.Create();
                    dialog.Show();
                }
                else
                {
                    partdesc.Text = isValid;
                }
            }
        };
Run Code Online (Sandbox Code Playgroud)

如果我在代码中留下pd.Hide(),那么我永远不会看到progressdialog.如果我把它拿出来,我只会在webservice返回结果之后看到progressdialog,然后保持原状,因为我没有将它隐藏在任何地方.如何在应用程序等待partValidate时显示它以及何时可以隐藏它?

Gre*_*les 5

从您的代码判断,看起来该partValidate()方法是同步的.由于此代码正在UI线程上执行,因此应用程序的UI将在该方法调用期间被阻止,这可以解释为什么在完成之前您没有看到任何UI更新.您可以通过在后台线程上运行调用来解决此问题,然后在需要更新UI后再移回UI线程:

partnumber.FocusChange += (object sender, View.FocusChangeEventArgs e) =>
{
    if (!e.HasFocus)
    {
        var pd = ProgressDialog.Show(this, "Processing", "Please Wait...", false);
        var res = new InventoryApp();
        res.partValidateCompleted += delegate { pd.Hide(); };

        ThreadPool.QueueUserWorkItem(state =>
        {
            var isValid = res.partValidate(partnumber.Text);

            RunOnUiThread(() =>
            {
                if (isValid == "Not Found")
                {
                    partnumber.Text = "";
                    partnumber.RequestFocus();
                    partqty.ClearFocus();
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.SetTitle("Invalid Part");
                    builder.SetMessage("Part number does not exist in database. Please ensure you are entering the correct part number and try again");
                    builder.SetPositiveButton("OK", delegate { });
                    var dialog = builder.Create();
                    dialog.Show();
                }
                else
                {
                    partdesc.Text = isValid;
                }
            }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我在这里发布了一篇博客文章,解释了在Mono for Android应用程序中处理这种情况的各种方法.