2010-06-22 6 views
34

Ich habe eine Webansicht, um den integrierten Browser zu überschreiben, und ich möchte eine Fortschrittsanzeige in der Titelleiste anzeigen.Android: Der Fortschrittsbalken im Fenstertitel zeigt nicht an

Dies ist der Code:

@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(); 
    } 
} 

Es sollte funktionieren, glaube ich, nach Android-Dokumenten und anderen Proben, die ich im Netz gesehen. Aber es nicht, könntest du mir bitte sagen, wo liege ich falsch?

Und noch eine Frage: wenn ich später später im Anwendungsmanifest android:theme="@android:style/Theme.NoTitleBar" deklariere, wird der Fortschrittsbalken mehr angezeigt oder nicht?

Vielen Dank.

Antwort

46

In der Tat der richtige Code ist (getestet und funktioniert):

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

Danke, genau das habe ich gesucht. –

+0

Funktioniert perfekt, danke! Beachten Sie, dass requestWindowFeature (Window.FEATURE_INDETERMINATE_PROGRESS); und setProgressBarIndeterminateVisibility (true); setzt den Fortschritt in der Aktionsleiste. –

+0

könnten Sie darauf hinweisen, was der Hauptunterschied ist? – ironic

3

WebView.loadUrl wird in einem nativen Thread ausgeführt, so dass setProgressBarIndeterminateVisibility (false) sofort aufgerufen wird. Auch wenn Sie Theme.NoTitleBar verwenden, wird die Titelleiste nicht angezeigt, und da der Fortschrittsbalken in der Titelleiste angezeigt wird, wird er ebenfalls nicht angezeigt.

So etwas sollte funktionieren.

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

Vielen Dank! – Manu

+0

Ich bin extrem neu in Android-Entwicklung, so dass dies eine dumme Frage sein kann. Was muss ich importieren, um 'BrowserActivity' zu verwenden? – Nick

+0

@Nick, BrowserActivity ist die aktuelle Aktivität, in der Sie Ihren Code implementieren. Es ist der Name Ihrer Aktivität. – Brigadier

16

ich auch das gleiche Problem.

Weil ich die android: theme = "@ android: style/Theme.NoTitleBar"

Ich löse es durch eine ProgressBar in der Layout-XML-Datei hinzufügen, wie zB:

<?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> 

In Code:

// wenn die Last url

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

...

// loading ... Fortschritt geändert

progressBar.setProgress(progress); 

...

// wenn Seite

progressBar.setVisible(View.GONE); 

C'est beenden beenden!

10

Ich habe das Problem gelöst.

Ihr Anruf an setProgressBarVisibility() muss in onStart() oder onResume() sein, denn vor diesem Punkt scheint es nicht garantiert zu sein, dass Sie eine Ansicht haben, über die Sie eine Sichtbarkeit ändern können.


Für diese unglaubliche Lösung von Dralangus gibt es hier einen vollständig getesteten Produktionscode. Vielen Dank, Dralangus! Schließlich ein Spinner, der bei der Gerätedrehung nicht verschwindet.

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

Für 'ListActivity' ist das die Lösung Vielen Dank – Chaitanya

+0

Eine der erstaunlichsten Antworten auf der Seite. Vielen Dank, Dralangus. Bounty unterwegs! – Fattie

8

Zu sehen, wie einige Antworten, die beiden Fortschrittsbalken mischen, entschieden eine andere Antwort auf die Spitze

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

diese sind für die Spinner

Diese sind für die horizontale Fortschrittsleiste hinzufügen Stil Fortschrittsbalken in der Aktionsleiste

Sie müssen nicht anfordern b andere Fensterfunktionen, nur die für den Fortschrittstyp, den Sie benötigen.

Der Fehler in OPs Code caling setProgressBarIndeterminateVisibility(true) haben Window.FEATURE_INDETERMINATE_PROGRESS nicht angefordert (oder umgekehrt: Aufruf setProgressBarIndeterminateVisibility() statt setProgressBarVisibility())

7

Es scheint, dass mit Android 5.0 (API 21) und über Windows.FEATURE_PROGRESS nicht mehr funktioniert. Einige Hinweise aus der Antwort von Univasity ermöglichend, konnte ich einen Fortschrittsbalken ähnlich dem in anderen Browsern erstellen.

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> 

Die FrameLayout ermöglicht es der Fortschrittsbalken über der Webansicht zu schweben. Einstellung android:max-100 macht es mit dem Standardbereich der Tätigkeit auszurichten, so dass die Werte nicht haben . umgewandelt werden, um den Ausfall von 0-10000 ansonsten durch den Fortschrittsbalken verwendet android:visibility="gone" macht die Statusleiste standardmäßig unsichtbar

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

Um es ganz offen zu sagen, ich habe gerade 6 Stunden damit verbracht, diesen Fortschrittsbalken arbeiten zu lassen und ich habe über 20 Fragen und Antworten hier und anderswo durchgegangen und dies ist, ** der einzige **, der voll zu funktionieren scheint Bildschirm-Webansicht Ich liebe dich dafür. Vielen Dank. –