2010-06-22 17 views
34

Ho una vista Web per sovrascrivere il browser integrato e voglio mostrare un indicatore di avanzamento sulla barra del titolo.Android: la barra di avanzamento nel titolo della finestra non viene visualizzata

Questo è il codice:

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

Si dovrebbe funzionare, penso che, in base alla documentazione Android e altri campioni che ho visto in rete. Ma non è così, potresti dirmi dove sbaglio?

E un'altra domanda: se a volte più tardi deciderò di dichiarare android:theme="@android:style/Theme.NoTitleBar" nel manifest dell'applicazione, la barra di avanzamento verrà visualizzata o meno?

Grazie.

risposta

46

In realtà il codice corretto è (testati e di lavoro):

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

Grazie, è esattamente quello che stavo cercando. –

+0

Funziona perfettamente, grazie! Si noti che requestWindowFeature (Window.FEATURE_INDETERMINATE_PROGRESS); e setProgressBarIndeterminateVisibility (true); imposta l'avanzamento del rotore nella barra delle azioni. –

+0

potresti indicare qual è la differenza principale? – ironic

3

WebView.loadUrl viene eseguito in un thread nativo in modo che setProgressBarIndeterminateVisibility (false) venga chiamato immediatamente più o meno. Inoltre, se si utilizza Theme.NoTitleBar, la barra del titolo non verrà visualizzata e poiché la barra di avanzamento si trova nella barra del titolo non verrà visualizzata neanche.

Qualcosa di simile dovrebbe funzionare.

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

Grazie mille! – Manu

+0

Sono estremamente nuovo allo sviluppo di Android, quindi questa potrebbe essere una domanda stupida. Cosa devo importare per usare 'BrowserActivity'? – Nick

+0

@Nick, BrowserActivity è l'attività corrente in cui si sta implementando il codice. È il nome della tua attività. – Brigadier

16

ho avuto lo stesso problema troppo.

Poiché ho impostato la android: theme = "@ Android: Stile/Theme.NoTitleBar"

ho risolto da aggiungere un ProgressBar nel file di layout XML, come ad esempio:

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

// quando il carico url

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

...

// loading ... progresso cambiato

progressBar.setProgress(progress); 

...

// quando pagina Fine

progressBar.setVisible(View.GONE); 

C'est fine!

10

Ho risolto il problema.

La chiamata al setProgressBarVisibility() deve essere in onStart() o onResume() perché, prima di quel punto, sembra che non sono garantiti per avere qualsiasi vista su cui è possibile modificare una visibilità.


Per questa incredibile soluzione di Dralangus, ecco un codice di produzione completamente testato. Grazie mille, Dralangus! Infine, uno spinner che non va via al momento della rotazione del dispositivo.

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

Per 'ListActivity' questa è la soluzione Grazie mille – Chaitanya

+0

Una delle risposte più sorprendenti sul sito. Grazie mille, Dralangus. Taglia sulla rotta! – Fattie

8

Vedendo come alcune risposte mescolano le due barre di avanzamento, ha deciso di aggiungere un'altra risposta

Questi sono per la barra di avanzamento orizzontale in alto

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

questi sono per la spinner- barra di avanzamento di stile nella barra delle azioni

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

Non è necessario richiedere b altre funzionalità della finestra, proprio quella per il tipo di avanzamento di cui hai bisogno.

L'errore nel codice di OP caling setProgressBarIndeterminateVisibility(true) aver non richiesto Window.FEATURE_INDETERMINATE_PROGRESS (o viceversa: chiamata setProgressBarIndeterminateVisibility() anziché setProgressBarVisibility())

7

Sembra che Android 5.0 (API 21) e superiore Windows.FEATURE_PROGRESS non funziona più. Prendendo alcuni suggerimenti dalla risposta per univasity, sono stato in grado di costruire una barra di progresso simile a quella degli altri browser.

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> 

Il FrameLayout consente la barra di avanzamento di galleggiare sopra il WebView. Impostazione android:max a a 100 rende allinearsi con l'intervallo predefinito dell'attività, in modo che i valori non devono . convertirsi al default di 0-10000 altrimenti utilizzato dalla barra di avanzamento android:visibility="gone" rende la barra di avanzamento invisibile per default

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

Per dirla senza mezzi termini, ho passato circa 6 ore a provare a far funzionare questa barra di avanzamento e ho sfogliato oltre 20 domande e risposte qui e altrove e questo è, ** l'unico **, che sembra funzionare a pieno schermata web. Ti amo per questo. Grazie. –

Problemi correlati