2

我是安卓新手。我正在尝试构建一个简单的 android 应用程序:用户单击按钮并出现一个进度对话框 5 秒钟。我使用 ProgressDialog.show() 并遇到了上下文参数的问题。这是我的xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <Button
        android:id="@+id/btnDialog2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btnDialog2" />
</LinearLayout>

这是我的代码:

public class Dialog22Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btnDialog2 = (Button)findViewById(R.id.btnDialog2);
        btnDialog2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final ProgressDialog dialog = ProgressDialog.show(getBaseContext(), 
                        "Progress dialog", "Loading...", true);
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            Thread.sleep(5000);
                            dialog.dismiss();
                        } catch (InterruptedException e) {

                        }

                    }
                }).start();
            }           
        });
    }
}

如果我将 ProgressDialog.show() 的上下文参数从 getBaseContext() 更改为 v.getContext() 我的程序将正常运行。所以我想问这里的上下文参数是什么意思?感谢您的帮助。

4

7 回答 7

1

只需使用Dialog22Activity.this而不是 getContext() 或 WhatEverContextFunction() 你想要的,当你在这个类中时,你会很酷:)

于 2012-10-18T12:32:10.477 回答
0

您可以参考 android 文档以获取这些解释,请参阅此

http://developer.android.com/reference/android/content/Context.html

于 2012-10-18T12:29:43.083 回答
0

getContext() 未在 Activity 中定义。它在视图(或视图子类)中用于获取对封闭上下文(活动)的引用。

于 2012-10-18T12:29:48.533 回答
0

如果您正在显示当前活动的进度对话框,请使用 classname.class 或 'this' 关键字作为上下文。

于 2016-09-23T18:36:24.637 回答
0

ProgressDialog.show(context) 中的上下文是指此 ProgressDialog 的父上下文。

BaseContext 有效地返回由 ContextWrapper 包装的任何上下文。通过查看代码,我可以说这可能是一个 Activity 或 Application 但是 ContextWrapper 有超过 40 个已知的直接和间接子级。

问题是这意味着方法返回的内容可能不明确,我宁愿直接使用 getContext() 或 Activity、FragmentActivity、ActionBarActivity 等,这样我就知道我在坚持什么,我在坚持什么对可能导致内存泄漏的事物的引用。此外,我还有一个额外的好处是能够利用这些类提供的方法。

如果你想在一个活动的外部类中使用 ProgressDialog,你可以在这个类中创建一个 Context 的实例,ProgressDialog 将使用它的上下文:

public class DownloadTask extends AsyncTask<URL, Integer, Void>{

ProgressDialog progressDialog;
private Context context;

@Override
protected void onPreExecute() {
    super.onPreExecute();

    progressDialog = new ProgressDialog(context);


}
于 2017-11-23T19:42:39.913 回答
0
        import androidx.appcompat.app.AppCompatActivity;
        import android.app.ProgressDialog;
        import android.os.Bundle;
        import android.webkit.WebView;
        import android.view.View;
        import android.webkit.WebViewClient;
        import android.webkit.WebChromeClient;
        import android.webkit.WebSettings;
        import android.webkit.JsResult;
        import android.widget.Toast;


        public class MainActivity extends AppCompatActivity {


        private WebView webView;
        private ProgressDialog progressDialog;

        startWebView("http://.../mobile/");

        }

        private void startWebView(String url) {

        WebSettings settings = webView.getSettings();

        settings.setJavaScriptEnabled(true);
        webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setLoadWithOverviewMode(true);

        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Loading...");
        progressDialog.setMessage("Wait while loading...");
        progressDialog.setCancelable(false); // disable dismiss by tapping outside of the dialog
        progressDialog.show();

        webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
        if (progressDialog.isShowing()) {
        progressDialog.dismiss();
        }
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        Toast.makeText(getApplicationContext(), "Error:" + description, Toast.LENGTH_SHORT).show();

        }
        });

        webView.loadUrl(url);
        }
        }
于 2020-05-01T05:27:44.193 回答
-1

它的活动上下文。利用:

public class Dialog22Activity extends Activity {
    private Activity activity;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        activity = this;

        Button btnDialog2 = (Button)findViewById(R.id.btnDialog2);
        btnDialog2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final ProgressDialog dialog = ProgressDialog.show(activity, 
                        "Progress dialog", "Loading...", true);
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            Thread.sleep(5000);
                            dialog.dismiss();
                        } catch (InterruptedException e) {

                        }

                    }
                }).start();
            }           
        });
    }
}

有关上下文的信息:Android 上的“上下文”是什么?

于 2012-10-18T12:29:11.213 回答