Java Android在加载url时向webview添加不确定的进度条
嗨,我正在尝试为我的webview实现一个进度条,它在等待webview加载时弹出。我见过几种方法,但我不确定哪种方法是最好的 布局:Java Android在加载url时向webview添加不确定的进度条,java,android,webview,android-progressbar,Java,Android,Webview,Android Progressbar,嗨,我正在尝试为我的webview实现一个进度条,它在等待webview加载时弹出。我见过几种方法,但我不确定哪种方法是最好的 布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_h
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
public class MapActivity extends MenuActivity {
private final static String TAG = "HearingTest";
private WebView webView;
private String urlString;
private ProgressDialog progressDialog;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_layout);
urlString = getString(R.string.location_url);
WebViewSettings();
LoadWebPage(urlString);
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Loading...");
progressDialog.setMessage("Please wait.");
//progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true);
progressDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
try {
//Do something...
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if (progressDialog!=null) {
progressDialog.dismiss();
}
}
};
task.execute((Void[])null);
}
public void LoadWebPage(String url){
try {
webView.loadUrl(url);
Log.d(TAG, "URL" + url + "connected");
}
catch (Exception e) {
Log.d(TAG, "URL: " + url + " couldn't connect.");
}
}
public void WebViewSettings(){
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals(urlString)) {
// This is my web site, so do not override; let my WebView load the page
return false;
}
// Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
@Override
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
});
}
protected void DisplayProgressBar(){
}
}
我以编程方式创建进度条
活动:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
public class MapActivity extends MenuActivity {
private final static String TAG = "HearingTest";
private WebView webView;
private String urlString;
private ProgressDialog progressDialog;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_layout);
urlString = getString(R.string.location_url);
WebViewSettings();
LoadWebPage(urlString);
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Loading...");
progressDialog.setMessage("Please wait.");
//progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true);
progressDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
try {
//Do something...
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if (progressDialog!=null) {
progressDialog.dismiss();
}
}
};
task.execute((Void[])null);
}
public void LoadWebPage(String url){
try {
webView.loadUrl(url);
Log.d(TAG, "URL" + url + "connected");
}
catch (Exception e) {
Log.d(TAG, "URL: " + url + " couldn't connect.");
}
}
public void WebViewSettings(){
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals(urlString)) {
// This is my web site, so do not override; let my WebView load the page
return false;
}
// Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
@Override
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
});
}
protected void DisplayProgressBar(){
}
}
公共类MapActivity扩展了MenuActivity{
私有最终静态字符串TAG=“HearingTest”;
私有网络视图;
私有字符串urlString;
私有进程对话;
私人语境;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.map\u布局);
urlString=getString(R.string.location\uURL);
WebViewSettings();
加载网页(URL字符串);
AsyncTask任务=新建AsyncTask(){
@凌驾
受保护的void onPreExecute(){
progressDialog=新建progressDialog(上下文);
progressDialog.setTitle(“加载…”);
progressDialog.setMessage(“请稍候”);
//progressDialog.setCancelable(假);
progressDialog.setUndeterminate(true);
progressDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
试一试{
//做点什么。。。
睡眠(5000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
如果(progressDialog!=null){
progressDialog.disclose();
}
}
};
task.execute((Void[])null);
}
公共无效加载网页(字符串url){
试一试{
loadUrl(url);
Log.d(标记“URL”+URL+“connected”);
}
捕获(例外e){
Log.d(标记“URL:+URL+”无法连接);
}
}
public void WebViewSettings(){
webView=(webView)findviewbyd(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuilTinZoomControl(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setLoadWithOverview模式(true);
setWebViewClient(新的WebViewClient(){
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
if(Uri.parse(url.getHost().equals(urlString)){
//这是我的网站,所以不要覆盖;让我的WebView加载页面
返回false;
}
//否则,该链接不适用于我的站点上的页面,因此启动另一个处理URL的活动
Intent Intent=newintent(Intent.ACTION_视图,Uri.parse(url));
星触觉(意向);
返回true;
}
@凌驾
ReceivedSlerRor上的公共无效(WebView视图、SslErrorHandler、SslError错误){
handler.procedure();
}
});
}
受保护的void DisplayProgressBar(){
}
}
我的问题是我真的不知道最好的方法是什么。以我目前的方式,当我创建一个新的进度条实例时,我得到一个空指针异常,我不知道为什么!另外,我真的不知道我是否在用最好的方式做这件事,因为我已经看到了用线程做这件事的另一种方式
如果有人能帮我解决我的问题或告诉我一个更好的解决方案,我将不胜感激。上下文是空的,这可能就是为什么你会得到
NullPointerException
使用
context=MapActivity初始化context
代码>在onCreate中
非常感谢您的帮助,新建它将非常简单。另一件事是我不知道受保护的Void doin background(Void…arg0)
用于什么,因为它实际上什么都不做,为什么需要此方法?doInBackground
是在后台执行的异步任务。它用于执行可能需要很长时间才能完成的(后台)操作(例如:从服务器请求数据)。您可以在此处阅读有关AsyncTask的更多信息