2010-06-22 71 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