Frage

Ich habe eine Web-Ansicht, welche die integrierten Browser außer Kraft zu setzen, und ich möchte eine Statusanzeige auf der Titelleiste zeigen.

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-Dokumentation und anderen Proben, die ich im Netz gesehen. Aber es funktioniert nicht, könnten Sie mir bitte sagen, wo bin ich falsch?

Und noch eine Frage: wenn manchmal später werde ich wählen android:theme="@android:style/Theme.NoTitleBar" im Anwendungsmanifest zu erklären, wird die Fortschrittsbalken zeigen mehr oder nicht

Danke.

War es hilfreich?

Lösung

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

Andere Tipps

Ich habe das gleiche Problem auch.

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

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

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

Im Code:

// wenn die Last url

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

...

// loading ... geändert Fortschritte

progressBar.setProgress(progress);

...

// wenn Seitenende

progressBar.setVisible(View.GONE);

C'est Finish!

Ich habe das Problem gelöst werden.

Ihr Anruf zu setProgressBarVisibility() in onStart() oder onResume() sein muss, weil vor diesem Punkt, es scheint, dass Sie nicht irgendetwas unternehmen sind garantiert, auf dem Sie eine Sicht ändern kann.


Für diese unglaubliche Lösung von Dralangus, hier einig vollständig getestet Produktionscode. Vielen Dank, Dralangus! Schließlich ein Spinner, der auf Gerätedrehung geht nicht weg.

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
    }

Zu sehen, wie einige Antworten, die beiden Fortschrittsbalken mischen, entschieden eine andere Antwort hinzufügen

Diese sind für die horizontalen Fortschrittsbalken an der Spitze

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

diese sind für die Spinner-Stil Fortschrittsbalken in der Aktionsleiste

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

Sie müssen nicht beide Fenster Funktionen verlangen, nur die eine für den Fortschritt Typ Sie benötigen.

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

Es scheint, dass mit Android 5.0 (API 21) und über Windows.FEATURE_PROGRESS nicht mehr funktioniert. Unter einigen Hinweisen aus der Antwort von univasity konnte ich einen Fortschrittsbalken ähnlich wie in anderen Browsern bauen.

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 dem Fortschrittsbalken über der Webansicht zu schweben. Einstellen android:max bis 100 macht es mit dem Standardbereich der Tätigkeit ausrichten, also nicht die Werte auf die Standardeinstellung von 0-10000 ansonsten durch die Fortschrittsbalken verwendet umgewandelt werden müssen. 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/");
}

WebView.loadUrl in einem nativen Thread so setProgressBarIndeterminateVisibility (false) ausgefuehrt wird sofort ziemlich genannt. Auch wenn Sie Theme.NoTitleBar die Titelleiste verwenden, wird nicht angezeigt, und da die Fortschrittsbalken in der Titelleiste ist, wird es auch nicht gezeigt werden.

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();
    } 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top