2010-06-22 68 views
34

我有一个Web视图来覆盖内置浏览器,我想在标题栏上显示进度指示器。Android:窗口标题中的进度条不显示

这是代码:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_PROGRESS); 

    setContentView(R.layout.browser); 
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL"); 

    try { 
     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setWebViewClient(new browserActivityClient()); 
     setProgressBarIndeterminateVisibility(true); 
     mWebView.loadUrl(currentURL); 
     setProgressBarIndeterminateVisibility(false); 
    } catch (Exception e) { 
     Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage()); 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 

它应该工作,我认为,根据Android的文档和其他样本我在网上看到的。但它不,你能告诉我我错在哪里吗?

还有一个问题:如果有时候以后我会选择在应用程序清单中声明android:theme="@android:style/Theme.NoTitleBar",进度条会不会再显示?

谢谢。

回答

46

事实上,正确的代码(测试工作):

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    requestWindowFeature(Window.FEATURE_PROGRESS); 
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL"); 

    setContentView(R.layout.browser); 

    setProgressBarIndeterminateVisibility(true); 
    setProgressBarVisibility(true); 

    try { 
     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setWebViewClient(new browserActivityClient()); 

     mWebView.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) { 
       setProgress(progress * 100); 
       if(progress == 100) { 
       setProgressBarIndeterminateVisibility(false); 
       setProgressBarVisibility(false); 
       } 
      } 
     }); 
     mWebView.loadUrl(currentURL); 
    } catch (Exception e) { 
     Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage()); 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 
+1

谢谢,那就是我一直在寻找的。 – 2011-02-26 05:00:23

+0

完美的作品,谢谢! 请注意requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);和setProgressBarIndeterminateVisibility(true);在操作栏中设置微调器进度。 – 2013-02-21 06:59:16

+0

你能指出什么是主要区别? – ironic 2013-10-15 13:23:44

3

WebView.loadUrl在本地线程中运行,所以setProgressBarIndeterminateVisibility(false)立即被调用。此外,如果您使用Theme.NoTitleBar,标题栏将不会显示,并且由于进度栏位于标题栏中,因此它也不会显示。

这样的事情应该工作。

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_PROGRESS); 

    setContentView(R.layout.browser); 
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL"); 

    try { 
     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setWebViewClient(new browserActivityClient()); 
     setProgressBarIndeterminateVisibility(true); 
     mWebview.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) { 
       if(progress == 100) { 
       setProgressBarIndeterminateVisibility(false); 
       } 
      } 
     }); 
     mWebView.loadUrl(currentURL); 
    } catch (Exception e) { 
     Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage()); 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 
+0

非常感谢! – Manu 2010-06-22 12:00:52

+0

我对Android开发非常陌生,所以这可能是一个愚蠢的问题。为了使用BrowserActivity,我需要导入什么? – Nick 2013-12-27 15:55:08

+0

@Nick,BrowserActivity是你正在实现你的代码的当前活动。这是你的活动的名称。 – Brigadier 2015-06-05 20:49:03

16

我得到了同样的问题太多。

因为我设置机器人:主题= “@安卓风格/ Theme.NoTitleBar”

我解决它在布局XML文件中添加一个进度条,如:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 

<ProgressBar android:id="@+id/progressbar" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="3px" 
    android:max="100" 
    android:visibility="gone" 
/> 

<WebView 
    android:id="@+id/webview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
/> 

</LinearLayout> 

在代码:

//当负载URL

progressBar.setProgress(0); 
progressBar.setVisible(View.VISIBLE); 

...

//加载...进步改变

progressBar.setProgress(progress); 

...

//当页面完成

progressBar.setVisible(View.GONE); 

花莲完成!

10

我已经解决了这个问题。

您致电setProgressBarVisibility()的电话号码必须为onStart()onResume(),因为在此之前,您似乎无法保证有任何视图可以更改其可见性。


对于Dralangus的这个令人难以置信的解决方案,这里有一些完全测试的生产代码。非常感谢Dralangus!最后,一个微调器在设备旋转时不会消失。

public class MainActivity extends Activity 
{ 
private static boolean showSpinner; // needs static 

public void spinnerOn() 
    { 
    showSpinner = true; 
    setProgressBarIndeterminateVisibility(true); 
    } 

public void spinnerOff() 
    { 
    showSpinner = false; 
    setProgressBarIndeterminateVisibility(false); 
    } 

protected void onResume() 
    { 
    // solved by Dralangus http://stackoverflow.com/a/7414659/294884 
    super.onResume(); 
    if (showSpinner) 
     { 
     spinnerOn(); 
     } 
    else 
     { 
     spinnerOff(); 
     } 
    } 

protected void onStart() 
    { 
    super.onStart(); 
    // note, onResume is called EVEN LATER than onStart, 
    // so your most reliable choice is onResume. 
    // eternal thanks to Dralangus for this solution 
    } 

@Override 
protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 

    setContentView(R.layout.activity_main); 

    ... // Your code 
    } 
+1

对于'ListActivity'这是解决方案非常感谢 – Chaitanya 2013-04-23 08:59:07

+0

网站上最令人惊叹的答案之一。非常感谢Dralangus。赏金途中! – Fattie 2014-05-21 13:11:08

8

看到一些答案怎么混了两个进度条,决定增加另一个答案

这些是在顶部

requestWindowFeature(Window.FEATURE_PROGRESS); 
setProgressBarIndeterminate(true); 
setProgress(intVal); 
setProgressBarVisibility(true); 

这些都为spinner-水平进度条风格进度条

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
setProgressBarIndeterminateVisibility(true); 

您不需要请求b其他窗口功能,只是您需要的进度类型的功能。

在OP的代码中的错误是caling setProgressBarIndeterminateVisibility(true)未要求Window.FEATURE_INDETERMINATE_PROGRESS(或反之亦然:调用的setProgressBarIndeterminateVisibility()代替setProgressBarVisibility()

7

看来,与Android 5.0(API 21)及以上Windows.FEATURE_PROGRESS不再起作用。从univasity的回应中获得一些提示,我能够建立一个类似于其他浏览器的进度条。

activity_main.xml中”

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity" 
android:id="@+id/relativeLayout"> 

<WebView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/webView" /> 

<ProgressBar 
    android:id="@+id/progressBar" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="8dp" 
    android:max="100" 
    android:progressTint="#FF29A8FF" 
    android:progressBackgroundTint="#FFFFFFFF" 
    android:visibility="gone" /> 
</FrameLayout> 

FrameLayout允许浮动web视图上面的进度条。设置android:max 100使它与活动中的默认范围对齐,所以值不必。被转化成0-10000以其他方式使用由所述进度条的默认android:visibility="gone"使得进度条默认无形

MainActivty.java:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Get the WebView and the ProgressBar from activity_main.xml. 
    final WebView mainWebView = (WebView) findViewById(R.id.webView); 
    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); 

    // Enables JavaScript. 
    mainWebView.getSettings().setJavaScriptEnabled(true); 

    // Updates the progress bar whenever there are changes and hides it again when it completes. 
    mainWebView.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) { 
      if (progress < 100) { 
        progressBar.setVisibility(View.VISIBLE); 
       } else { 
        progressBar.setVisibility(View.GONE); 
       } 
      progressBar.setProgress(progress); 
     } 
    }); 

    // Makes the mainWebView handle all URLs internally instead of calling the default browser. 
    mainWebView.setWebViewClient(new WebViewClient()); 

    // Load a sample URL. 
    mainWebView.loadUrl("http://developer.android.com/"); 
} 
+1

说穿了,我只花了大约6个小时试图让这个进度条工作,并且在这里和其他地方浏览了20多个Q&A,这是**唯一一个**,它似乎在全部工作屏幕webview。我爱你。谢谢。 – 2016-05-27 11:52:16