34 votes

Android: la barre de progression dans le titre de la fenêtre ne s'affiche pas

J'ai un affichage web pour remplacer le navigateur intégré et j'en veux pour preuve un indicateur de progression dans la barre de titre.

C'est le 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();
    } 
}

Cela devrait fonctionner, je pense que, selon Android docs et d'autres échantillons que j'ai vu sur le net. Mais ça ne marche pas, pourriez-vous s'il vous plaît dites-moi où je me trompe?

Et une autre question: si, parfois, plus tard, je vais choisir de déclarer android:theme="@android:style/Theme.NoTitleBar" dans le manifeste de l'application, la barre de progression de montrer plus ou pas?

Je vous remercie.

47voto

Manu Points 568

En fait, le bon code est (testé et fonctionne):

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

16voto

univasity Points 139

J'ai aussi le même problème.

Parce que j'ai défini l' android: theme = "@ android: style / Theme.NoTitleBar"

Je le résous en ajoutant un ProgressBar dans le fichier xml de mise en page, tel que:

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

Dans du code:

// lors du chargement de l'url

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

...

// chargement ... la progression a changé

 progressBar.setProgress(progress);
 

...

// à la fin de la page

 progressBar.setVisible(View.GONE);
 

C'est fini!

10voto

Dralangus Points 286

J'ai résolu le problème.

Votre appel à l' setProgressBarVisibility() doit être en onStart() ou onResume() parce que, avant de ce point, il semble que vous ne sont pas garantis pour toute la vue sur laquelle vous pouvez modifier la visibilité.


Pour cette incroyable solution par Dralangus, voici quelques entièrement testé le code de production. Merci beaucoup, Dralangus! Enfin, un spinner qui ne va pas loin sur l'appareil de rotation.

public class MainActivity extends Activité { private static boolean showSpinner; // statique besoins

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

    etc...
    }

8voto

Ivan Bartsov Points 4689

De voir comment certaines des réponses mélanger les deux barres de progression, a décidé d'ajouter une autre réponse

Ceux-ci sont pour l'horizontale de la barre de progression en haut

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

ceux-ci sont pour le compteur de style de la barre de progression dans l'actionbar

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

Vous n'avez pas besoin de demander les deux dispositifs de la fenêtre, seulement pour le progrès type dont vous avez besoin.

L'erreur dans le cas des OP code est caling setProgressBarIndeterminateVisibility(true) n'ayant pas demandé l' Window.FEATURE_INDETERMINATE_PROGRESS (ou vice-versa: l'appel d' setProgressBarIndeterminateVisibility() au lieu de setProgressBarVisibility())

3voto

Robby Pond Points 37875

WebView.loadUrl est exécuté dans un thread natif, donc setProgressBarIndeterminateVisibility (false) est appelé immédiatement à peu près. De plus, si vous utilisez Theme.NoTitleBar, la barre de titre ne sera pas affichée et puisque la barre de progression est dans la barre de titre, elle ne sera pas non plus affichée.

Quelque chose comme ça devrait fonctionner.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X