Android: индикатор выполнения в заголовке окна не отображается - PullRequest
34 голосов
/ 22 июня 2010

У меня есть веб-представление для переопределения встроенного браузера, и я хочу показать индикатор прогресса в строке заголовка.

Это код:

    @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" в манифесте приложения, будет ли индикатор выполнения отображаться большенет?

Спасибо.

Ответы [ 6 ]

47 голосов
/ 27 июня 2010

На самом деле правильный код (проверен и работает):

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();
    } 
}
16 голосов
/ 22 марта 2011

У меня тоже такая же проблема.

Поскольку я установил android: theme = "@ android: style / Theme.NoTitleBar"

Я решаю ее с помощьюдобавить ProgressBar в 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);

Cвсе готово!

10 голосов
/ 14 сентября 2011

Я решил проблему.

Ваш звонок на setProgressBarVisibility() должен быть в onStart() или onResume(), потому что до этого момента, похоже, у вас нет гарантии, что вы будете иметь представлениеможет изменить видимость.


Для этого невероятного решения от 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
    }
8 голосов
/ 23 мая 2014

Видя, как некоторые ответы смешивают два индикатора выполнения, решил добавить еще один ответ

Это для горизонтального индикатора выполнения вверху

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

для индикатора выполнения в стиле счетчика на панели действий

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

Вам не нужно запрашивать обе функции окна, только одну для нужного вам типа прогресса.

Ошибка в коде OP заключается в вызове setProgressBarIndeterminateVisibility(true), который не запросил Window.FEATURE_INDETERMINATE_PROGRESS (или наоборот: вызов setProgressBarIndeterminateVisibility() вместо setProgressBarVisibility())

7 голосов
/ 17 сентября 2015

Похоже, что с 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 позволяет индикатору выполнения плавать над веб-представлением. Установка 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/");
}
3 голосов
/ 22 июня 2010

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();
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...